我希望下面的代码打印012345,但它打印012012。为什么?我希望对incr的调用能够访问相同的变量,因为它们是从同一个类继承的,但它们显然是不同的变量。
class a(object):
var = 0
@classmethod
def incr(cls):
print cls.var
cls.var+=1
class b(a):
def func(self):
super(b,self).incr()
class c(a):
def func(self):
super(c,self).incr()
t = a()
t1 = b()
t2 = c()
t1.func()
t1.func()
t1.func()
t2.func()
t2.func()
t2.func()
发布于 2018-08-16 14:39:08
它们是从同一个类继承的,但是通过super传递给classmethod的cls是调用该方法的当前类。 super访问方法的基类版本,但调用的cls是进行超级调用的类。这是做之间的微妙差异之一:
def func(self):
super(c, self).incr() # same as a.__dict__['incr'].__get__(self, type(self))()
和
def func(self):
a.incr()
def incr(cls):
print cls
...
发布于 2018-08-16 16:22:15
类b和类c分别从类a继承,var每次都设置为0。
让类c在类a中获得与类b相同的var值的一种方法是,类c可以继承自类b,如下所示:
class a(object):
var = 0
@classmethod
def incr(cls):
print cls.var
cls.var+=1
class b(a):
def func(self):
super(b,self).incr()
class c(b):
def func(self):
super(c,self).incr()
t = a()
t1 = b()
t2 = c()
t1.func()
t1.func()
t1.func()
t2.func()
t2.func()
t2.func()`
https://stackoverflow.com/questions/-100006003
复制相似问题