gpt4 book ai didi

python - 是否可以动态继承仅在 python 运行时才知道的类?

转载 作者:太空狗 更新时间:2023-10-29 17:03:06 27 4
gpt4 key购买 nike

我想通过 Bar 类扩展 Foo 类,我遇到的问题是我无法以通常的方式扩展它 ( 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()

同样,这不是我要找的东西:

class Foo(Bar):
pass

foobar = Foo()
foobar.super_cool_function()

最佳答案

TL;DR: 是的,使用 python 闭包

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

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

return Foo

DynamicFoo = get_class(Bar)
myobj = DynamicFoo()

这是您将在 Python 中看到的常见模式 - 利用闭包动态创建回调和类。


上面的答案假定 Bar 被正确定义,但实际上并非如此。 super_cool_function 缺少一个 self 参数。调用实例方法时,第一个参数(实例本身)会自 Action 为第一个属性传入。

因此,Bar 的正确定义是:

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

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

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

return Foo

DynamicFoo = get_class(Bar)
myobj = DynamicFoo()
myobj.super_cool_function()
# Cool

关于python - 是否可以动态继承仅在 python 运行时才知道的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51812872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com