【发布时间】:2021-12-30 12:26:51
【问题描述】:
我正在尝试使用type 在 Python 中动态创建子类:
class A:
@classmethod
def create_subclass(cls, name, attrs):
return type(name, (cls,), attrs)
for i in range(5):
x = A.create_subclass("B", {"func": abs})
print(A.__subclasses__())
这是我在输出中看到的:
[<class '__main__.B'>, <class '__main__.B'>, <class '__main__.B'>, <class '__main__.B'>, <class '__main__.B'>]
显然,这不是我的本意。 在这方面有两个问题:
- Python 如何处理同名的多个类?
- pythonic 的处理方式是什么?当然,我可以在已经存在的子类中查找名称,但是如何处理命名空间/模块?
【问题讨论】:
-
我不完全确定,但我的猜测是,由于
__subclasses__返回一个列表,可能以前的子类没有从那里删除,所以它们留在那里,它们也不是同一个对象,我测试过通过在字典中添加一个变量:{'var': i}所以他们每个人都有不同的。然后我遍历返回的列表并检索了该名称,它们都有自己的值,因此它们不会被覆盖,显然也不会被删除,因此如果需要,您仍然可以使用它们,您只需要从该列表中获取它们 -
名称只是与类关联的元数据。重要的是类对象本身。
A.__subclasses__()包含对 5 个不同类的引用,这些类恰好具有相同的__name__属性值。
标签: python python-3.x oop metaprogramming