可以设置Python对象的任何属性

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中真正想做的事情.如果你的类的用户想要在类的实例上存储一些额外的属性,那么没有理由不让它们,实际上你可能想要的原因很多.

  • 这很棒,我不知道`__slots__` (2认同)
  • 有趣的方法!我不知道`__slots__`.然而,我正在审视这种方法,并偶然发现http://stackoverflow.com/questions/472000/python-slots.该线程中提到了一些好的警告.如果我们使用`__slots__`,尤其缺少`__dict__`方法! (2认同)