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

为什么同一类的两个实例具有不同的属性(Python)是明智的?,python,python-3.x,Python,Python 3.x,现在,如果你比较dirapple和dirgoogle,苹果实例将有一个额外的属性ceo 然而,苹果股票和谷歌股票都是真实的 允许具有不同属性的对象同时成为同一类的实例背后的直觉是什么?实际上,你什么时候用这个 我本以为属于同一类的实例的对象必须具有相同的属性列表。这通常是没有用的,并且不鼓励使用,这两个原因都是出于样式的原因,并且因为在CPython中,它通过中断使每个实例使用更多的内存 当它出现时,它通常用于缓存一些昂贵的计算值,这些值可能并不总是被使用,但如果它是为重用而计算的,则应该存储这

现在,如果你比较dirapple和dirgoogle,苹果实例将有一个额外的属性ceo

然而,苹果股票和谷歌股票都是真实的

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


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

这通常是没有用的,并且不鼓励使用,这两个原因都是出于样式的原因,并且因为在CPython中,它通过中断使每个实例使用更多的内存

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

为了启用这些公认不常见的用例,大多数Python对象将它们的属性存储在一个隐藏的dict中,并且它们在uu init_u_u_u_u中的赋值和其他时候的赋值之间没有太大区别

如果不需要此功能,可以禁用创建任意属性以明确描述合法属性;这将阻止创建任何其他属性,并进一步减少类的每个实例内存使用,甚至比密钥共享字典所能做的还要多。在您的情况下,您可以使用:

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)

它通常没有用处,也不鼓励使用,这既是出于样式的原因,也是因为在CPython中,它通过中断使每个实例使用更多内存

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

为了启用这些公认不常见的用例,大多数Python对象将它们的属性存储在一个隐藏的dict中,并且它们在uu init_u_u_u_u中的赋值和其他时候的赋值之间没有太大区别

如果不需要此功能,可以禁用创建任意属性以明确描述合法属性;这将阻止创建任何其他属性,并进一步减少类的每个实例内存使用,甚至比密钥共享字典所能做的还要多。在您的情况下,您可以使用:

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)