python - Python 中空元组的潜在用途

标签 python immutability class-variables immutablearray

我在研究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()?)可能会很危险,因为它在迭代时会失败。

由于不变性,我认为这是一个不错的选择,但我认为我没有在任何地方看到有人谈论过这个问题。你认为这个推理有什么缺陷吗?是Python风格的吗?

最佳答案

您将类变量与实例变量混淆了(这很容易做到,因为在没有初始化实例变量的情况下,查找会找到类变量)。在这种情况下,当您打算为实例变量设置默认值时,您已经明确表示 default_sth 是一个类变量。改用这个:

class BaseClass(object):
    def __init__(self, sth=None):
        if sth is None:
            sth = []

    def foo(self):
       for sth in self.sth:
           pass

您可能会对使用“硬编码”默认值感到犹豫,但您只是通过尝试为默认值使用单独的名称来增加冗长性。只需注释并记录您的 __init__ 方法,以指示 sth 是什么以及如果没有,其默认值应该是什么 其他值被传递。除非您有充分的理由,否则不要尝试使默认值本身可配置。

就不变性而言,只有元组是不可变的,引用它的名称不可变。没有什么可以阻止某人使用您的原始代码并说

BaseClass.default_sth = []

尽管将 default_sth 作为一个元组开始,但您又回到了开始的地方。

关于python - Python 中空元组的潜在用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24705095/

相关文章:

c# - 在 C# 中实现只读(不可变)对象接口(interface)

python - 将模块方法分配给类变量或实例变量

ruby - Ruby 的 attr_accessor 如何产生类变量或类实例变量而不是实例变量?

python - 防止/改变对类变量的访问

python - Pygame - 按退格键更改 Sprite 颜色

python - 调用方法时如何访问父方法?

ruby - Ruby 中的字符串是可变的吗?

python - Python中如何使用Selenium点击链接

python - 如何使用 ctypes 将列表列表的 Python 列表转换为 C 数组?

scala - 如何将可变 HashMap 转换为 Scala 中的不可变等价物?