Python: multi level inheritance
我很难找到解决Python继承问题的有效方法。
因此存在如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Foo( object ): def __init__(): self.some_vars def foo_func(): x = Bar() def foo_bar_func() x += 1 class Fighters( Foo ): def __init__(): Foo.__init__() def func1(): Foo.some_attribute def func2(): Foo.someother_func() class Bar(): def bar_func(): #some stuff here |
问题在于我需要覆盖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Foo( Foo ): def __init__(): Foo.__init__() def foo_func(): #Overridden method x = myBar() class myFighters( Foo ): def __init__(): Foo.__init__() def func1(): Foo.some_attribute def func2(): Foo.someother_func() class myBar(): def bar_func(): #the function that I actually need to change #my sweet code here |
号
唯一实际不同的是
一个是我必须创建一个从
第二个问题是,为了使用
在进行一些代码清理以生成可运行的示例之后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Foo( object ): def __init__(self): print("foo init") self.foo_func() def foo_func(self): print("making bar") self.x = Bar() def foo_bar_func(self): self.x.bar_func() class Fighters( Foo ): def __init__(self): print("fighters init") Foo.__init__(self) def func1(self): Foo.some_attribute def func2(self): Foo.someother_func() class Bar(object): def __init__(self): print("bar init") def bar_func(self): #some stuff here print("bar bar_func") |
。
实例化原始战斗机:
1 2 | f1 = Fighters() f1.foo_bar_func() |
它从原始的bar类调用方法:
1 2 3 4 5 | fighters init foo init making bar bar init bar bar_func |
。
现在我们可以将战士分为myfighters子类和mybar子类。重写foo类的foo-func is myfighters,该类具有对mybar的构造函数调用,它执行您希望的操作,而不复制方法:
1 2 3 4 5 6 7 8 | class MyFighters(Fighters): def foo_func(self): print("making mybar") self.x = MyBar() class MyBar(Bar): def bar_func(self): print("mybar bar_func") |
。
当我们创建新的战斗机时:
1 2 | f2 = MyFighters() f2.foo_bar_func() |
我们看到它从新的bar类调用方法:
1 2 3 4 5 | fighters init foo init making mybar bar init mybar bar_func |
。
显然,这只起作用,因为创建bar对象的方法对于子类和替换来说是微不足道的。一般来说,情况并非如此,因为它可能直接在in it中完成,而不是调用一个方法来完成。所以原始类的设计是允许这个例子运行的。
类上定义的所有方法都将实例作为第一个参数。本公约称该实例为
1 2 3 | class Foo(object): def __init__(self): self.x = 1 |
第二,如果不需要覆盖父类的方法,只需将其去掉:
1 2 3 4 5 | class Fighters(Foo): # __init__ would be here, but I leave it out to inherit the method def func_1(self): ... |
号
最后,如果您想参考父母的行为,请使用
1 2 3 4 | class MyFighters(Fighters): def __init__(self): super(MyFighters, self).__init__() self.y = 2 |
另请参见本例和