为什么同一类的两个实例具有不同的属性(Python)是明智的?

bob*_*obo 1 python python-3.x

class Stock:
...     def __init__(self, ticker, price):
...             self.ticker = ticker
...             self.price = price
...
>>> apple = Stock('APPL', 100)
>>> apple.ceo='tim cook' 
>>> google = Stock('GOOG', 10)
Run Code Online (Sandbox Code Playgroud)

现在,如果您进行比较dir(apple),则dir(google)apple实例将有一个额外的属性ceo

然而,isinstance(apple,Stock)isinstance(google,Stock)都是 True。

允许具有不同属性的对象同时成为同一类的实例背后的直觉是什么?你什么时候使用这个,实际上?

我会认为作为同一类实例的对象必须具有相同的属性列表。

Sha*_*ger 5

由于样式原因,并且因为(在 CPython 中)它使每个实例使用更多内存(通过破坏密钥共享字典),它通常没有用,也不鼓励使用。

当它出现时,它通常用于缓存(一些计算可能不总是使用的昂贵的值,但如果计算用于重用则应该存储),或者在对象主要充当字符串键字典的情况下具有属性访问语义,类似于 JSON 对象(types.SimpleNamespace适用于大多数此类情况)。

为了启用这些(公认不常见的)用例,大多数 Python 对象将它们的属性存储dict在幕后,并且它们不区分(很多)__init__在其他时间和其他时间的赋值。

如果你不想要这个特性,你可以通过__slots__在你的类定义明确描述合法属性来禁用任意属性创建;这将阻止创建任何其他属性,并进一步减少您的类的每个实例内存使用量(甚至超过密钥共享字典所能做到的)。在你的情况下,你会这样做:

class Stock:
    __slots__ = 'ticker', 'price'
    def __init__(self, ticker, price):
        self.ticker = ticker
        self.price = price
Run Code Online (Sandbox Code Playgroud)