gpt4 book ai didi

python - 动态创建具有继承和类方法的类列表

转载 作者:行者123 更新时间:2023-12-01 05:44:46 25 4
gpt4 key购买 nike

我有一个类列表,并且我正在尝试动态创建另一个类列表,这样每个类都有一个 classmethod ,它可以从原始类创建子类的实例列表。
问题是所有方法最终都会返回同一类的实例(最后创建的)。

这是我的代码的最小化版本:

class C1():
var = 1
class C2():
var = 2

parents = (C1, C2)
children = []
wrappers = []

for c in parents:

class ChildClass(c):
pass
children.append(ChildClass())

class Wrapper():
@classmethod
def method(cls):
cls.wrapped = ChildClass()

wrappers.append(Wrapper)

print(list(child.var for child in children))

for wrapper in wrappers:
wrapper.method()

print(list(wrapper.wrapped.var for wrapper in wrappers))

输出:

[1, 2]
[2, 2]

您可以看到 children 列表包含不同的实例,而 classmethod 在这两种情况下都会创建 C2 子级的实例。

如何修复我的代码,以便每个 classmethod 创建正确类的实例?

(我使用的是 python 2.7.4)

最佳答案

Wrapper.method() 中的 ChildClass 引用是一个自由变量,这意味着当 Wrapper.method() 时它将被解析> 被调用,不是在定义方法时被调用。

当您调用该方法时,名称 ChildClass 将引用您创建的最后一个类。

您要么需要为 ChildClass 提供一个只有一个明确值的作用域,要么在定义时绑定(bind)引用。后者可以通过使用函数参数默认值来完成:

class Wrapper():
@classmethod
def method(cls, child_class=ChildClass):
cls.wrapped = child_class()

您还可以使用函数作用域将引用绑定(bind)到该作用域中的局部变量:

def createClasses(parent):
class ChildClass(parent):
pass

class Wrapper():
@classmethod
def method(cls):
cls.wrapped = ChildClass()

return ChildClass, Wrapper

for c in parents:
child, wrapper = createClasses(c)

children.append(child)
wrappers.append(wrapper)

这里,当Wrapper.method引用ChildClass时,它将在createClasses函数的本地命名空间中查找,并且只会有一个值绑定(bind)到该名称。

关于python - 动态创建具有继承和类方法的类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440840/

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