标题几乎是自我解释的,但我认为用一个例子可以更好地解释。
class Dog():
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
def get_color(self):
return body_color()
class personality_1():
def get_happiness(self):
return happiness_with_owner()
def get_sadness(self):
return sadness()
## A lot more personality methods here
class SocialDog(Dog):
# Override regular method
def get_color(self):
return face_color()
# I want to override the personality 1 class but not completely, just one method
class personality_2(>>>How to inherit from personality_1?<<<):
# Now, I would like to override just one method of personality 1:
def get_happiness(self):
return happiness_with_others()
希望逻辑是正确的。我试图使用super()但没有成功。希望我能在不使用父类的显式调用的情况下找到解决方案。
有什么想法?
提前致谢!
答案 0 :(得分:1)
要从您指定的类继承,根据您提供的代码,所需的只是定义类personality_2
,如下所示:
class SocialDog(Dog):
#...
class personality_2(Dog.personality_1):
#...
现在,关于尝试使用super()
时的问题,这可能是因为Dog
和Dog.personality_1
的基类不是从python默认类{{1}继承的}这是使用object
方法所必需的。有关详细信息,请参阅this答案。如果这就是您所追求的,那么您需要做的就是将super()
和Dog
(或其最终衍生的任何内容)的类声明修改为以下内容:
Dog.personality_1
然后你可以像任何其他子类一样对待class Dog(object):
#...
class personality_1(object):
#...
。如果您使用的是python 2,请记住在使用SocialDog.personality_2
时需要使用完全限定名称:
super()
答案 1 :(得分:1)
使用外部类的名称来到达内部类:
class SocialDog(Dog):
class personality_2(Dog.personality_1):
# ...
那就是说,这是你正在做的一件非常奇怪的事情,将个性类隐藏在狗类中,然后在外面使用它们 ...
如果某个人 与<{1}}或Dog
这样的特定类紧密相关,那么SocialDog
认为可以安全地混淆行为personality_2
?事实上,人格方法应该是personality_1
或Dog
方法。
或者,如果哪条狗获得哪种性格并不重要,为什么不将个性类留在模块级别,在那里它们可以像任何其他类一样被实例化和继承?然后,您创建的各种SocialDog
派生类将采用可选的Dog
参数:
personality