扩展超类,在Python中调用子类

2024-04-25 20:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个新手在编写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”的属性或方法。在

  1. 扩展所有的子类对我来说是不可能的,因为也有 许多子类。

  2. 我可以通过定义函数来解决这个问题 在我的模块下而不是超类下,但我就是这么想的 不像OO架构。

有更好的解决办法吗?或任何关键字或OO设计概念我可以参考?在

谢谢!在


Tags: 模块方法self程序objdef子类variable
2条回答

是的,有一个关键词——“错误”。OO是模型,你想做的不应该做。在

如果你有充分的理由,你可以做得更简单:

import externalLib as myLib

def myNewMethod(self):
    print(self.name)

myLib.Superclass.myNewMethod = myNewMethod

为什么你的代码没用?在

定义继承自的超类时myLib超类,它只停留在这个模块中。当您定义超类时,名称“Superclass”只在全局范围内与新类绑定,但旧值不变,myLib/externalLib作用域中的co超类保持不变。我可以看到,如果你使用java或C++之类的经典OO语言,你会发现它可能起作用。在

几乎不知道的事实——爪哇/C++ + OO模型不是真正面向对象的。它确实如此,但OOP模型实际上是在Smalltalk中实现的。在

您正在查找monkeypatch原始类。因为方法只是类的属性,所以可以添加更多:

import externalLib as myLib

def myNewMethod(self):
    print(self.name)

myLib.Superclas.myNewMethod = myNewMethod

相关问题 更多 >