【发布时间】:2018-05-13 06:32:52
【问题描述】:
我看到这被标记为“类变量和实例变量之间有什么区别?”的重复项。但是我不相信我在示例中使用了任何实例变量,我的两个类都没有__init__ 我正在以两种不同的方式编辑类变量并试图了解它们之间的区别,不是 类和实例变量的区别。
我试图了解仅使用.var 和.__class__.var 调用类变量之间的区别。我认为这与子类化有关,所以我编写了以下代码。
class Foo:
foo = 0
class Bar(Foo):
bar = 1
def print_class_vals(f, b):
""" prints both instant.var and instant.__class__.var for foo and bar"""
print("f.foo: {}, {} "
"b.foo: {}, {} "
"b.bar: {}, {} "
"".format(f.foo, f.__class__.foo,
b.foo, b.__class__.foo,
b.bar, b.__class__.bar))
f = Foo()
b = Bar()
print_class_vals(f, b)
Foo.foo += 1
print_class_vals(f, b)
Bar.foo += 1
print_class_vals(f, b)
Bar.bar += 1
print_class_vals(f, b)
这会输出以下内容:
f.foo: 0, 0, b.foo: 0, 0, b.bar: 1, 1
f.foo: 1, 1, b.foo: 1, 1, b.bar: 1, 1
f.foo: 1, 1, b.foo: 2, 2, b.bar: 1, 1
f.foo: 1, 1, b.foo: 2, 2, b.bar: 2, 2
我似乎找不到调用inst.var 和inst.__class__.var 之间的任何区别。它们有什么不同,我什么时候应该使用其中一种?
【问题讨论】:
-
你几乎不应该使用
__class__。 -
@chepner,副本的最佳答案最后有一个解释,讨论了为什么你最终得到相同的值。
-
如果你没有一个实例变量来隐藏它,那么访问一个类变量绝对没有区别。
-
@MisterMiyagi 实际上,这不是真的。用一个方法(或者一个函数值的类属性,也是一样的)试试。
标签: python python-3.x class