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。
允许具有不同属性的对象同时成为同一类的实例背后的直觉是什么?你什么时候使用这个,实际上?
我会认为作为同一类实例的对象必须具有相同的属性列表。
由于样式原因,并且因为(在 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)
| 归档时间: |
|
| 查看次数: |
31 次 |
| 最近记录: |