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
的具体实例
答案 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)