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)
归档时间: |
|
查看次数: |
1512 次 |
最近记录: |