关于继承:在Python 2中从子类调用父类方法

Call a parent class method from a child class in Python 2

我想在python 2中使用super()调用父类方法。

在python 3中,我会这样编码:

1
2
3
4
5
6
7
8
9
10
11
12
    class base:
        @classmethod    
        def func(cls):
            print("in base:" + cls.__name__)

    class child(base):
        @classmethod    
        def func(cls):
            super().func()
            print("in child:" + cls.__name__)

    child.func()

使用此输出:

1
2
    in base: child
    in child: child

但是,我不知道如何在Python2中实现这一点。当然,我可以使用base.func(),但是我不想另外指定父类名称,主要是我得到了不想要的结果:

1
2
    in base: base
    in child: child

cls(cls is child作为super()函数调用中的第一个参数时,我得到这个错误:

1
    TypeError: must be type, not classobj

你知道它是如何使用super()或类似的函数的吗?在这个函数中,我不必指定父类的名称。


进一步研究另一个答案,你可以像

1
2
3
4
5
6
7
8
9
10
11
12
class base(object):
        @classmethod    
        def func(cls):
            print("in base:" + cls.__name__)

class child(base):
        @classmethod    
        def func(cls):
            super(cls, cls).func()
            print("in child:" + cls.__name__)

child.func()


父对象需要从Python2中的对象继承。所以:

1
2
3
4
5
6
7
8
9
10
11
class base(object):
    def func(self):
        print("in base")

class child(base):
    def func(self):
        super(child, self).func()
        print("in child")

c = child()
c.func()


我试图做一些类似的事情,我试图基本上"走上"继承链,直到我找到某个基类,然后用类名在那里做一些事情。我遇到的问题是,所有这些答案都假定你知道你想要得到的班级的名字。我尝试了"super(cls,cls)"方法,但得到了上面描述的"iniefirmit递归"问题。这是我降落的地方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@classmethod
def parent_name(cls):
    if BaseDocument in cls.__bases__:
        # This will return the name of the first parent that subclasses BaseDocument
        return cls.__name__
    else:
        for klass in cls.__bases__:
            try:
                parent_name = klass.parent_name()
                if parent_name is not None:
                    return parent_name
            except AttributeError:
                pass

        return None