在Python中通过参数扩展类

Ivy*_* F. 15 python inheritance closures class

我想Foo通过类扩展类Bar,我遇到的问题是我无法以通常的方式扩展它(class Foo(Bar))因为类Bar是动态生成的.

我做了一个小例子来说明我想要的结果:

class Bar:
    def super_cool_function():
        print("Cool")

class Foo:
    def __init__(self, another_class):
        # I want to extend Foo by another_class

# Desired result
foobar = Foo(Bar)
foobar.super_cool_function()
Run Code Online (Sandbox Code Playgroud)

不是我想要的:

class Foo(Bar):
    pass

foobar = Foo()
foobar.super_cool_function()
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 22

"这个类Bar有点动态生成"这很好......只要它遵循蓝图(应该扩展的类Foo),你可以在这里利用python闭包.通过在内部创建并从函数返回它来动态创建新类.

def get_class(superclass):
    class Foo(superclass):
        def __init__(self, ...):
           ...

    return Foo

DynamicFoo = get_class(Bar)
myobj = DynamicFoo()
Run Code Online (Sandbox Code Playgroud)

这是你在python中看到的常见模式 - 利用闭包动态创建回调和类.


上面的答案假定它Bar是正确定义的,而实际上并非如此.在super_cool_function缺少自我参数.始终使用第一个参数(实例本身)作为第一个属性传入实例方法.

所以,正确的定义Bar是:

class Bar:
   def super_cool_function(self):
       print("Cool")
Run Code Online (Sandbox Code Playgroud)

现在,get_class用最简单的内部类定义Foo:

def get_class(superclass):
    class Foo(superclass):
        pass

    return Foo

DynamicFoo = get_class(Bar)
myobj = DynamicFoo()
myobj.super_cool_function()
# Cool
Run Code Online (Sandbox Code Playgroud)