为什么同一个类的两个实例具有不同的属性(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)?的主要内容,如果未能解决你的问题,请参考以下文章
实现具有自动递增实例属性的类的最 Pythonic 方式是啥?