【发布时间】:2014-07-11 19:25:51
【问题描述】:
我在玩 Python 中类级变量的风险,我认为列表作为类级变量的风险可以通过元组来解决,例如空元组。
拍摄:
class BaseClass(object):
default_sth = []
def foo(self):
for sth in self.default_sth:
pass
这是有风险的,因为:
class SubClass(BaseClass):
pass
a = SubClass()
a.default_sth.append(3)
print(BaseClass.default_sth) # [3]
使用 None 代替空元组 (tuple()?) 可能会很危险,因为它在迭代它时会失败。
由于不可变性,我认为这是一个不错的选择,但我认为我在任何地方都没有看到任何人谈论这个。你觉得这个推理有什么缺陷吗?是pythonic吗?
【问题讨论】:
-
嗯。您是否有可能正在寻找通过name mangling
__leading_double_underscorenames 在 Python 中支持的类私有成员?这些基本上是实际类所独有的类级别属性,并且不能(容易地,或者意外地)被子类更改。有关详细说明,请参阅 Raymond Hettinger 的演讲 Class development toolkit(名称修改从 33:24 左右开始)。 -
另请参阅this answer,了解有关名称修改工作原理的快速示例。
-
嗯,这是一个有趣的概念。这样做的问题是我确实希望变量在子类中是可覆盖的,但不改变原始类中的值。
标签: python immutability class-variables immutablearray