直接在Python中调用Parent方法

时间:2015-08-14 19:45:12

标签: python

我在GParent类中有一个testdthod,它由Parent和Child继承。

我该怎么做?

我尝试了这个,但它不起作用......

GParent.testmethod(self) 

class GParent():
    def testmethod(self):
        print "This is test method"


class Parent():
    def testmethod(self):
        print "This is test method"


class Child(Parent):
    def __init__(self):
        print "This is init method"
        GParent.testmethod(self)

c = Child() 

2 个答案:

答案 0 :(得分:1)

首先:https://docs.python.org/2/tutorial/classes.html#inheritance

无论如何......

GParent.testmethod(self) <-- calling a method before it is defined

class GParent(): <-- always inherit object on your base class to ensure you are using new style classes
    def testmethod(self):
        print "This is test method"


class Parent(): <-- not inheriting anything
    def testmethod(self): <-- if you were inheriting GParent you would be overriding the method that is defined in GParent here.
        print "This is test method"


class Child(Parent):
    def __init__(self):
        print "This is init method"
        GParent.testmethod(self) <-- if you want to call the method you are inheriting you would use self.testmethod()

c = Child()

看看这段代码并运行它,也许它会帮助你。

from __future__ import print_function #so we can use python 3 print function

class GParent(object):
    def gparent_testmethod(self):
        print("Grandparent test method ")


class Parent(GParent):
    def parent_testmethod(self): # 
        print("Parent test method")


class Child(Parent):
    def child_testmethod(self):
        print("This is the child test method")

c = Child()
c.gparent_testmethod()
c.parent_testmethod()
c.child_testmethod()

答案 1 :(得分:0)

如果没有testmethod的实例作为其第一个参数,则无法调用GParent的GParent

<强>继承

class GParent(object):
    def testmethod(self):
        print "I'm a grandpa"

class Parent(GParent):

    # implicitly inherit __init__()                                                                                                                  

    # inherit and override testmethod()                                                                                                              
    def testmethod(self):
        print "I'm a papa"

class Child(Parent):

    def __init__(self):
        super(Child, self).__init__()
        # You can only call testmethod with an instance of Child
        # though technically it is calling the parent's up the chain                                                                                      
        self.testmethod()

    # inherit parent's testmethod implicitly

c = Child() # print "I'm a papa"

但是,显式调用父方法的两种方法是通过组合或类方法

<强>组合物

class Parent(object):
    def testmethod(self):
        print "I'm a papa"

class Child(object):
    def __init__(self):
        self.parent = Parent()

        # call own's testmethod                                                                                                                      
        self.testmethod()

        # call parent's method                                                                                                                       
        self.parentmethod()

    def parentmethod(self):
        self.parent.testmethod()

    def testmethod(self):
        print "I'm a son"

c = Child()

班级方法

class Parent(object):
    @classmethod
    def testmethod(cls):
        print "I'm a papa"

class Child(object):
    def __init__(self):
        # call own's testmethod                                                                                                                      
        self.testmethod()

        # call parent's method                                                                                                                       
        Parent.testmethod()

    def testmethod(self):
        print "I'm a son"

c = Child()

在处理多重继承时,使用组合已成为建议,因为继承会创建对父类的依赖。