假设我在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

最佳答案

关于什么:

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的期望,☺

高温超导

09-06 06:51