Python超级覆盖对象名

时间:2015-06-01 00:42:25

标签: python inheritance override super

我正在尝试扩展框架,我有类似的东西:

class A(object):
    def test(self):
        print(1)


class B(object):
    def method(self):
        a = A()
        a.test()


class CustomA(A):
    def test(self):
        print(2)


class C(B):

    def method(self):
        A = CustomA
        super(C, self).method()

c = C()
c.method()

A类和B类来自框架。

我想从A编辑这个test(),并让C使用这个新方法。

在此代码中,例如,如何使代码打印2而不是1?

[更新]

这只是一个简单的例子。我想延长this class。因此,不要创建SettingsPanel,而是创建CustomSettingsPanel

但问题是我需要使用很多类,所以我只想要一种让python始终使用CustomSettingsPanel而不是SettingsPanel的方法。

2 个答案:

答案 0 :(得分:1)

你不需要在C中调用super。你试图覆盖B的方法。

install.packages("foo", type="source", repos=NULL)

答案 1 :(得分:0)

有很多方法可以解决这个问题。

如果您可以修改B,那么您可以对其进行重构,以便在A中接受参数,而不是对___init___进行硬性依赖,以允许其指定要实例化的类。类似的东西:

class B(object):
    def __init___(self, clazz=A):
        self.__clazz = clazz
    def method(self):
        a = self.__clazz()
        a.test()

class C(B):
    def __init__(self):
        super(C, self).__init__(CustomA)

如果您无法修改B,那么我建议将其包装在适配器中,让您的代码通过该类进行互动(而不是B或{{1}然后通过flag参数管理适配器中C vs A选择的复杂性:

CustomA

还可以查看其他对象创建模式(工厂等)。一切都取决于你的约束以及你想要完成的事情。