per*_*ero 11 python properties class object
例如,这段代码是Python:
a = object()
a.b = 3
Run Code Online (Sandbox Code Playgroud)
投 AttributeError: 'object' object has no attribute 'b'
但是,这段代码:
class c(object): pass
a = c()
a.b = 3
Run Code Online (Sandbox Code Playgroud)
很好.当类x没有该属性时,为什么我可以分配属性b?如何让我的类只定义属性?
kin*_*all 12
该object类型是一个用C编写的内置类,不允许您向其添加属性.它已被明确编码以防止它.
在您自己的类中获得相同行为的最简单方法是使用该__slots__属性来定义要支持的确切属性的列表.Python将为这些属性保留空间,不允许任何其他属性.
class c(object):
__slots__ = "foo", "bar", "baz"
a = c()
a.foo = 3 # works
a.b = 3 # AttributeError
Run Code Online (Sandbox Code Playgroud)
当然,这种方法有一些警告:你不能腌制这样的对象,并且期望每个对象都有一个__dict__属性的代码会破坏."更多Pythonic"的方式是使用__setattr__()另一张海报所示的自定义.当然,有很多方法可以解决这个问题,__slots__除了子类化和将属性添加到子类之外,没有办法.
一般来说,这不是你应该在Python中真正想做的事情.如果你的类的用户想要在类的实例上存储一些额外的属性,那么没有理由不让它们,实际上你可能想要的原因很多.