我目前想知道为什么这个适度的代码有一个我不期望的输出:
class Product(object):
price = 0
def __init__(self, tmp_price):
self.price = tmp_price
class Market(object):
products = []
def __init__(self):
self.products.append(Product(10))
a = Market()
b = Market()
print a.products[0]
print b.products[0]
print len(a.products)
确实,我得到了一些输出:
<__main__.Product object at 0x7fe5899e46d0>
<__main__.Product object at 0x7fe5899e46d0>
2
有没有人有解释?我想这与python处理引用的方式有关,除了......
答案 0 :(得分:5)
问题在于您的代码的这一部分:
class Market(object):
products = [] # products belongs to the class and is shared by all instances!
def __init__(self):
self.products.append(Product(10)) # appending to the 'products' class atribute
products
属性属于该类,并且所有实例都是 shared 。可以从类的所有实例访问类属性。当您从self(self.products
)引用产品时,Python找不到属于该实例的products
,因此它会查看是否可以在类中找到products
。
你真正想要的是:
class Market(object):
def __init__(self):
self.products = [] # products belongs to the instance
self.products.append(Product(10))
答案 1 :(得分:4)
您正在引用静态类变量。
Static class variables in Python 这里有很多关于它的信息!
Market.products[0]
是实际值。
这与您发现的实例变量不同。 http://legacy.python.org/doc/essays/ppt/acm-ws/sld051.htm
答案 2 :(得分:3)
这是因为您打印的是对象引用,而不是其字段的值;
尝试更改
print a.products[0]
print b.products[0]
到
print a.products[0].price
print b.products[0].price
答案 3 :(得分:2)
因为在市场 init 中,self.products正在使用Market类成员产品,它在所有Market的实例之间共享。
答案 4 :(得分:1)
这是Python实现 _ str _ ()函数的默认方式:
<module-name>.<class-name> <type> at <memory-address>
如果您不喜欢这种表示形式,您可以随时提供 _ str _ ()的实现。提供内存地址是为了检查两个变量是否实际指向同一项目。