子类内部的Python类继承自父类中的类

时间:2014-11-20 04:10:54

标签: python class inheritance subclass

标题几乎是自我解释的,但我认为用一个例子可以更好地解释。

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()但没有成功。希望我能在不使用父类的显式调用的情况下找到解决方案。

有什么想法?

提前致谢!

2 个答案:

答案 0 :(得分:1)

要从您指定的类继承,根据您提供的代码,所需的只是定义类personality_2,如下所示:

class SocialDog(Dog):
  #...
    class personality_2(Dog.personality_1):
      #...

现在,关于尝试使用super()时的问题,这可能是因为DogDog.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_1Dog方法。

或者,如果哪条狗获得哪种性格并不重要,为什么不将个性类留在模块级别,在那里它们可以像任何其他类一样被实例化和继承?然后,您创建的各种SocialDog派生类将采用可选的Dog参数:

personality