我是编写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
结果:"子类"没有名为"myNewMethod"的属性或方法。
扩展所有子类对我来说是不可能的,因为也有许多子类。
我可以通过定义函数来解决问题在我的模块下而不是超类下,但我只是这样想不像 OO 架构。
有没有更好的解决方案?或者我可以参考任何关键字或OO设计概念?
谢谢!
是的,有一个关键字 - "错误"。OO是模型,你想做的事情不应该做。
如果你有很好的理由,你可以做得更简单:
import externalLib as myLib
def myNewMethod(self):
print(self.name)
myLib.Superclass.myNewMethod = myNewMethod
为什么你的代码不起作用?
当你定义从myLib.Superclass继承的超类时,它只保留在这个模块中。当你定义你的超类时,名称"超类"只在全局范围内与你的新类绑定,但旧值没有改变,myLib/externalLib 作用域中的 co 超类保持不变。我可以看到你是如何得到它的印象,如果你使用经典的OO语言,如Java或C++。
鲜为人知的事实 - Java/C++ OO模型并不是真正面向对象的。它确实有这样的印象,但OOP模型确实在Smalltalk中实现。
你正在寻找原始类的猴子补丁。由于方法只是类的属性,因此始终可以添加更多属性:
import externalLib as myLib
def myNewMethod(self):
print(self.name)
myLib.Superclas.myNewMethod = myNewMethod