加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python超级覆盖对象名称

发布时间:2020-12-20 13:50:16 所属栏目:Python 来源:网络整理
导读:我正在尝试扩展框架,我有这样的事情: 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
我正在尝试扩展框架,我有这样的事情:

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的方法.

解决方法

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

如果你可以编辑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或C)进行交互,然后通过一个管理适配器中的A vs CustomA选择的复杂性.标志参数:

class ABCAdapter(object):
    USE_CLASS_A = 0
    USE_CLASS_CUSTOMA = 1

    def __init__(self,test_class=USE_CLASS_A):
        if test_class = USE_CLASS_A:
            self.a_instance = A()
        elif test_class = USE_CLASS_CUSTOMA:
            self.a_instance = CustomA()

    def method(self):
        self.a_instance.test()

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读