我有一个带有许多默认值的实例变量的类,这些值可以在instantiation中被重写(注意:没有可变的默认参数)。
由于多次编写self.x = x等代码是相当多余的,所以我以编程方式初始化变量。
为了说明这一点,考虑这个例子(为了简洁起见,它只有5个实例变量和省略的任何方法):
例子:

# The "painful" way
class A:
    def __init__(self, a, b=2, c=3, d=4.5, e=5):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e

# The "lazy" way
class B:
    def __init__(self, a, b=2, c=3, d=4.5, e=5):
        self.__dict__.update({k: v for k, v in locals().items() if k!='self'})

# The "better lazy" way suggested
class C:
    def __init__(self, a, b=2, c=3, d=4.5, e=5):
            for k, v in locals().items():
                if k != 'self':
                    setattr(self, k, v)

x = A(1, c=7)
y = B(1, c=7)
z = C(1, c=7)

print(x.__dict__)  # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
print(y.__dict__)  # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
print(z.__dict__)  # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}

所以为了让我的生活更简单,我使用了B类中的成语,它产生的结果与A类相同。
这是不好的做法吗有什么陷阱吗?
附录:
使用这个习惯用法的另一个原因是为了节省一些空间——我打算在MicroPython中使用它。不管是什么原因,只有A级中所示的方法才能起作用。

最佳答案

我建议使用class A中显示的代码你所拥有的是重复性代码,而不是冗余代码,重复性并不总是坏的。您只需编写一次__init__,对于您的类所期望的实例变量,为每个实例变量保留一个赋值是很好的文档(显式且清晰)。
不过,要记住的一点是,太多可以初始化为不同参数的变量可能是需要重新设计类的标志将一些单独的参数分组到单独的列表、dict甚至其他类中是否更有意义?

10-07 12:24
查看更多