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

时间:2014-01-13 12:41:14

标签: python subclass extend superclass

我是编写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架构。

  3. 有没有更好的解决方案?或者我可以参考任何关键字或OO设计概念?

    谢谢!

2 个答案:

答案 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