首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何处理Python类方法和继承?

如何处理Python类方法和继承?
EN

Stack Overflow用户
提问于 2018-08-16 06:25:15
回答 2查看 0关注 0票数 0

我希望下面的代码打印012345,但它打印012012。为什么?我希望对incr的调用能够访问相同的变量,因为它们是从同一个类继承的,但它们显然是不同的变量。

代码语言:txt
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2018-08-16 14:39:08

它们是从同一个类继承的,但是通过super传递给classmethod的cls是调用该方法的当前类。 super访问方法的基类版本,但调用的cls是进行超级调用的类。这是做之间的微妙差异之一:

代码语言:txt
复制
def func(self):
    super(c, self).incr() # same as a.__dict__['incr'].__get__(self, type(self))()

代码语言:txt
复制
def func(self):
    a.incr() 
代码语言:txt
复制
def incr(cls):
    print cls
    ...
票数 0
EN

Stack Overflow用户

发布于 2018-08-16 16:22:15

类b和类c分别从类a继承,var每次都设置为0。

让类c在类a中获得与类b相同的var值的一种方法是,类c可以继承自类b,如下所示:

代码语言:txt
复制
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()` 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档