首页 > 解决方案 > 无需 elseif 即可设置类变量的优雅方法

问题描述

我是python新手,所以如果有明显的解决方案,我很抱歉。我正在研究一些看起来像这样的代码(总共 80 个条目):

class variable():
number = ""

def __init__(self, number):
    self.no = number
    self.longname = "Long variable name"
    self.name = "Variable"
    self.tag = "tag"
    self.unit = "unit"

def get_varname(self):

    if self.no == 1:
        self.name = 'Second'
        self.unit = '[s]'
    elif self.no == 2:
        self.name = 'Metre'
        self.unit = '[m]'
    elif self.no == 3:
        self.name = 'Kilogram'
        self.tag = 'kg'
        self.unit = '[kg]'
    elif self.no == 4:
        self.name = 'Ampere'
        self.tag = 'Amp'
        self.unit = '[A]'

有什么优雅的方法来重写它吗?我想一种方法是使用字典,但我不确定这是否会使代码更容易。也只有一些条目包含“标签”。

标签: pythonclassif-statement

解决方案


使用字典

就像@deceze 所说,使用 dict 将数字映射到元组是一种方法。你可以做的是像这样设置元组("Name", "unit", "tag - optional"):然后,您可以获取元组的大小以查看它是否有标签。所以,字典看起来像:

class variable():
    def __init__(self, number):
        self.no = number
        self.longname = "Long variable name"
        self.name = "Variable"
        self.tag = "tag"
        self.unit = "unit"
        self.map = {1: ('Second','[s]'), 2: ('Metre', '[m]'), 
                         3: ('Kilogram', '[kg]', 'kg'), 4: ('Ampere', '[A]', 'Amp')}
    def get_varname(self):
        selfTuple = self.map[self.no]
        self.name = selfTuple[0]
        self.unit = selfTuple[1]
        if (len(selfTuple)==3):
            self.tag = selfTuple[2]

在 3.10 中使用匹配大小写

在 Python 3.10 中,您可以使用称为 match case 的特殊语句。它类似于 Java 中的 switch 语句。

class variable():
    def __init__(self, number):
        self.no = number
        self.longname = "Long variable name"
        self.name = "Variable"
        self.tag = "tag"
        self.unit = "unit"
    def get_varname(self):
        match self.no:
            case 1:
                self.name = 'Second'
                self.unit = '[s]'
            case 2:
                self.name = 'Metre'
                self.unit = '[m]'
            case 3:
                self.name = 'Kilogram'
                self.tag = 'kg'
                self.unit = '[kg]'
            case 4:
                self.name = 'Ampere'
                self.tag = 'Amp'
                self.unit = '[A]'

推荐阅读