嵌套类,它继承自Python 3中外部父级的嵌套类

时间:2015-06-17 00:15:37

标签: python python-3.x inheritance class-method

假设我在Python 3中有以下类:

class CoolCar:
    @classmethod
    def myWheels(cls):
        cls.Wheels().out()
    class Wheels:
        def __init__(self):
            self.s = "I'm round!"
        def out(self):
            print(self.s)

一切都很好。现在我想要一个派生类:

class TerribleTank(CoolCar):
    class Wheels(CoolCar.Wheels):
        def __init__(self):
            self.s = "I'm square!!"

这正如我所料:

CoolCar.myWheels()
TerribleTank.myWheels()

但令我困扰的是,我必须在CoolCar的定义中两次写TerribleTank。所以我尝试了这个:

class TerribleTank(CoolCar):
    class Wheels(super().Wheels):
        def __init__(self):
            self.s = "I'm square!!"

哪个不起作用。现在,我知道它不起作用,因为super()正在寻找第一个参数self / cls来开始搜索。

所以最后我的问题是:这样的东西是否有效,所以我不需要明确写出第二个CoolCar

1 个答案:

答案 0 :(得分:2)

怎么样:

class CoolCar:
    @classmethod
    def myWheels(cls):
        cls.Wheels().out()
    class Wheels:
        def __init__(self):
            self.s = "I'm round!"
        def out(self):
            print(self.s)

class TerribleTank(CoolCar):
    class Wheels(TerribleTank.Wheels):
        def __init__(self):
            self.s = "I'm square!!"

>>> TerribleTank.myWheels()
I'm square!!

基本上当你在CoolCar中继承TerribleTank时,你设置TerribleTank.Wheels作为对CoolCar.Wheels的引用,直到你用它自己的新定义来影响它。 TerribleTank定义。因此,我相信这符合您在TerribleBank定义中没有CoolCar两次的期望☺

HTH