gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:58:25 25 4
gpt4 key购买 nike

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)

现在如果你比较 dir(apple)dir(google) apple 实例将有一个额外的属性 ceo.

但是,isinstance(apple,Stock)isinstance(google,Stock) 都是 True。

允许具有不同属性的对象都是同一类的实例背后的直觉是什么?实际上,您什么时候使用它?

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

最佳答案

它通常没有用,并且不鼓励,既出于样式原因,也因为(在 CPython 中)它使每个实例使用更多内存(通过破坏 key-sharing dictionaries )。

当它出现时,通常是用于缓存(一些计算值可能并不总是使用的昂贵的值,但如果为了重用而计算它应该存储),或者在对象主要充当字符串的情况下- 具有属性访问语义的键控字典,类似于 JSON 对象 (types.SimpleNamespace serves for most such cases)。

为了启用这些(诚然不常见的)用例,大多数 Python 对象将它们的属性存储在引擎盖下的 dict 中,并且它们不会(太多)区分 __init__< 中的赋值 和其他时间。

如果您不想要此功能,可以禁用任意属性的创建 by defining __slots__ on your class明确描述法律属性;这将阻止创建任何其他属性,并进一步减少类的每个实例内存使用量(甚至比 key 共享字典可以做的更多)。在你的情况下,你会这样做:

class Stock:
__slots__ = 'ticker', 'price'
def __init__(self, ticker, price):
self.ticker = ticker
self.price = price

关于python - 为什么同一类的两个实例具有不同的属性(Python)是明智的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62273389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com