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() 还可以查看其他对象创建模式(工厂等).一切都取决于你的约束和你想要完成的事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |