在初始化对象的父类上调用方法

时间:2016-01-02 15:39:32

标签: python

class Animal(object):

    def __init__(self, name):
        self.name = name

    def intro(self):
        return "I am an animal named %s" %self.name


class Dog(Animal):

    def intro(self):
        return "I am a dog named %s" %self.name 


class Puppy(Dog):

    def intro(self):
        return "I am a puppy named %s" %self.name


dizzy = Puppy("Dizzy")

如果我想让dizzy.intro()的单个实例返回Dog或Animal intro方法,我该怎么办?也就是说,我不想在课堂上进行超级调用以覆盖该方法,但我只需要一次性的方式来指定我使用的三种intro方法中的哪一种dizzy的具体实例

2 个答案:

答案 0 :(得分:2)

您有多个选项,所有选项都可以在实例外部使用。

您可以使用super();它需要一个类和一个实例,并将在MRO命令中找到下一个方法:

super(Puppy, dizzy).intro()  # uses Dog.intro()
super(Dog, dizzy).intro()    # uses Animal.intro()

或者您可以在类上使用未绑定方法,手动传入实例:

Dog.intro(dizzy)
Animal.intro(dizzy)

这基本上硬编码了您使用的方法,而使用super()仍然是动态的,并且在添加更复杂的类层次结构时会进行调整。

任何一种方法都可以作为方法的一部分,只需将dizzy替换为self即可。您现在需要的只是选择所调用版本的方法。也许随机选一个:

import random

def any_intro(self):
    cls = random.choice(type(self).__mro__[:-1])
    return cls.intro(self)

将使用unbound-method选项来选择一个类,除了object之外的任何类。

答案 1 :(得分:0)

不知何故,你应该指定你想要使用哪一个。将它作为参数传递给intro方法。您可以为Puppy class

执行类似的操作
def intro(self, parent):
    if(parent == 2):
        super(Animal, self).intro()
    elif(parent == 1):
        super(Dog, self).intro()
    else:
        return "I am a puppy named %s" %self.name

你也可以直接打电话给祖父方法:

Animal.intro(self)