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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么同一个类的两个实例具有不同的属性(Python)?相关的知识,希望对你有一定的参考价值。

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)都为真。

允许具有不同属性的对象都成为同一类的实例的直觉是什么?实际上,您何时使用此功能?

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

答案

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

[通常出现在缓存中(计算值可能并不总是会花费一些昂贵的开销,但是如果计算得出可重用则应将其存储),或者在对象主要充当字符串的情况下-具有属性访问语义的键控字典,类似于JSON对象(types.SimpleNamespace serves for most such cases)。

[为了启用这些(公认的不常见的)用例,大多数Python对象将其属性存储在幕后的types.SimpleNamespace中,并且它们在dict中的分配与其他时间之间没有(很多)区别。

如果您不希望使用此功能,则可以禁用创建任意属性__init__来显式描述合法属性;这将防止创建任何其他属性,并进一步减少类的每个实例的内存使用量(甚至比共享密钥的字典所能做的更多)。就您而言,您可以使用:

by defining __slots__ on your class

以上是关于为什么同一个类的两个实例具有不同的属性(Python)?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA对象具有状态,行为,还有啥属性?

比较两个对象的不同属性集

实现具有自动递增实例属性的类的最 Pythonic 方式是啥?

获取从抽象类继承并在属性中具有特定值的类的实例

XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称

面向对象