我是编写OO程序的新手,我找不到任何解决我面临的问题的好方法。愿有人可以帮忙吗?
我正在寻找一些我无法自由修改它的模块,我想在超类上添加一个方法,以便我可以调用子类的实例。所以在我的模块中:
import externalLib as myLib
class Superclass(myLib.Superclass):
def myNewMethod(self):
print(self.name) # Print a member variable
def __main__():
obj = myLib.Subclass(args)
obj.myNewMethod() # Expect prints the same member variable in subclass
结果:“Subclass”没有名为“myNewMethod”的属性或方法。
扩展所有子类是不可能的,因为也有 许多子类。
我可以通过定义函数来解决问题 在我的模块下而不是超类,但我只是这么想 不像是OO架构。
有没有更好的解决方案?或者我可以参考任何关键字或OO设计概念?
谢谢!
答案 0 :(得分:2)
是的,有一个关键字 - “错误”。 OO是模型,你不应该做你想做的事。
如果你有充分的理由,你可以更简单地做到:
import externalLib as myLib
def myNewMethod(self):
print(self.name)
myLib.Superclass.myNewMethod = myNewMethod
为什么你的代码不起作用?
当您定义从myLib.Superclass继承的Superclass时,它仅保留在此模块中。当您定义超类时,名称“Superclass”仅在全局范围内与您的新类绑定,但旧值未更改,myLib / externalLib范围中的co Superclass保持不变。如果您使用Java或C ++等经典OO语言,我可以看到您对它的印象如何。
鲜为人知的事实 - Java / C ++ OO模型并非真正面向对象。它确实有这样的印象,但是在Smalltalk中真正实现了OOP模型。
答案 1 :(得分:2)
您正在寻找原始课程的monkeypatch。因为方法只是类的属性,所以总是可以添加更多:
import externalLib as myLib
def myNewMethod(self):
print(self.name)
myLib.Superclas.myNewMethod = myNewMethod