Python及其参考资料

时间:2012-03-18 00:22:36

标签: python

我目前想知道为什么这个适度的代码有一个我不期望的输出:

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处理引用的方式有关,除了......

5 个答案:

答案 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))

另见Python: Difference between class and instance attributes

答案 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 _ ()的实现。提供内存地址是为了检查两个变量是否实际指向同一项目。