如何扩展类实例?

OHL*_*ÁLÁ 0 python class

我有以下代码,这是一个命令行测试

from cmd2 import Cmd
class App(Cmd, object):
    def __init__(self, *args, **kwargs):
            pass

    def do_test(self, line):
        'test'
        print "parent test"


class App2():
    def __init__(self, *args, **kwargs):
            pass

    def do_test2(self, line):
        print "Test2"           


app = App()
app.cmdloop()
Run Code Online (Sandbox Code Playgroud)

是否有可能使用额外的功能扩展App类?我知道有以下解决方案

class App2(App):
     ....   

app = App2()
app.cmdloop()
Run Code Online (Sandbox Code Playgroud)

但在我的情况下,我想只运行App并扩展它,如果可能的话.

kin*_*all 5

一般来说,这不是一个好主意,因为当人们(包括你在六个月内)阅读代码时,他们会期望App他们知道的类,以及类的扩展版本具有不同的名称.但是,没有什么能阻止您将子类命名为与原始子类相同:

class App(App):
    # etc.
Run Code Online (Sandbox Code Playgroud)

Python很聪明地知道App括号中的含义就是它已经知道的那个,然后,由于新类具有相同的名称,它将取代原来的类.不用担心,新类包含对旧类的引用,因此旧类不会完全消失(如果确实如此,子类继承的任何内容都不起作用).

如果该类来自您导入的某个模块,您甚至可以将替换类修补回原始模块,以便导入该模块的所有代码都使用您的替换类.(虽然我会建议反对它!)

import appmodule

class App(appmodule.App):
    # etc.

appmodule.App = App
Run Code Online (Sandbox Code Playgroud)

当然,这很棘手,因为如果您不在脚本中首先执行此操作,某些模块可能已经导入了对原始类的引用.如果其他模块也试图修补同一个类,那么一切都会崩溃.尽管如此,如果你想让自己和那些维护代码的人感到困惑,那么Python会让你这么做!