【问题标题】:Is it possible to restrict attributes to be defined only in __init__ in python? [duplicate]是否可以限制属性只能在 python 的 __init__ 中定义? [复制]
【发布时间】:2016-04-13 05:00:15
【问题描述】:

我正在编写具有大量类定义的代码,并且我想让类的所有属性只在__init__()中定义。

主要原因是避免我自己的错误定义新的(意外的)属性,并且我不希望在导入模块运行时定义新的属性(见下文)。

您可以不受惩罚地运行此代码,我试图避免这种情况。

class A():pass
a=A()
a.a=1
print(a.a)

【问题讨论】:

  • 这个词是“属性”,而不是“属性”。虽然有很多方法可以做到这一点,但我建议使用 linter 来执行检查。
  • 这里已经回答了:stackoverflow.com/questions/3603502/…

标签: python


【解决方案1】:

这里有两个选项:

首先,您可以使用__slots__,它将您的类限制为一组特定的属性。

不完全是您想要的(插槽一开始就不是为此设计的!),但很接近:

class A(object):
    __slots__ = ["a"]

a = A()
a.a = 1  # Will work
a.b = 2  # Will not work

其次,您可以覆盖__setattr__,并让它查找一个标志以防止在初始化完成后创建新属性:

class A(object):

    __frozen__ = False

    def __init__(self, a):
        self.a = a
        self.__frozen__ = True  # At this point no more changes can be made

    def __setattr__(self, attr, value):
        if self.__frozen__ and not hasattr(self, attr):
            raise Exception("New attributes cannot be added!")  # Create your own Exception subclass for this
        super(A, self).__setattr__(attr, value)

  a = A(1)
  a.a = 2  # Works
  a.b = 2  # Throws an Exception

这更接近你想要的。但是,您应该认真考虑这是否真的可取。这是避免错误的最好方法吗?也许你想例如改为编写测试?

除其他外,如果您的子类调用 super(TheSubClass, self).__init__(*args, **kwargs) 然后尝试访问属性,这将破坏子类化。

【讨论】:

    【解决方案2】:

    你想要Slots:

    class MyAttrOnly:
        __slots__ = ('a', 'b')
    
    
    m = MyAttrOnly()
    m.d = "doesn't work"
    

    这会抛出异常:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'MyAttrOnly' object has no attribute 'd'
    

    【讨论】:

    • 在 Ryan 对Python __slots__ 的回答中,“非常不鼓励使用__slots__ 来约束属性创建,通常你想避免它,因为它会破坏泡菜,以及其他一些自省蟒蛇的特点。”意思是如果使用__slots__?
    • 这意味着__slots__ 是为了性能,而不是作为访问限制机制。因此,在将类与需要常规动态类的代码一起使用时,您将遇到麻烦。
    • __slots__ 有点像在你的油箱里倒糖来防止别人偷你的车。是的,他们不能再开车了,但这也让你的生活变得更加艰难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2019-01-08
    • 2013-12-19
    相关资源
    最近更新 更多