动态创建 类 同名
Dynamically created classes with the same name
我正在尝试使用 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 方式?当然,我可以在已经存在的子类中查找名称,但是namespaces/modules如何处理?
Python不太在意类名,这些会有所不同类,你只需要有一种机制来保存和查找你想要的类。
class A:
def __repr__(self):
return f"{self.__class__.__name__} floor={self.floor}"
@classmethod
def create_subclass(cls, name, attrs):
return type(name, (cls,), attrs)
di_cls = {}
#save them in a dictionary
for i in range(5):
di_cls[i] = A.create_subclass("B", {"func": abs, "floor" : i})
for i, cls in di_cls.items():
print(f"{cls()}")
class config:
#put them in hierarchical namespaces
cls_level1 = A.create_subclass("B", {"func": abs, "floor" : 11})
class level2:
cls_level2 = A.create_subclass("B", {"func": abs, "floor" : 22})
print(f"{config.cls_level1()=}")
print(f"{config.level2.cls_level2()}")
l1 = config.cls_level1()
l2 = config.level2.cls_level2()
print(f"{isinstance(l1, A)=}")
print(f"{isinstance(l2, A)=}")
print(f"{isinstance(l2, config.level2.cls_level2)=}")
print(f"{isinstance(l2, config.cls_level1)=}")
输出:
B floor=0
B floor=1
B floor=2
B floor=3
B floor=4
config.cls_level1()=B floor=11
B floor=22
isinstance(l1, A)=True
isinstance(l2, A)=True
isinstance(l2, config.level2.cls_level2)=True
isinstance(l2, config.cls_level1)=False
我正在尝试使用 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 方式?当然,我可以在已经存在的子类中查找名称,但是namespaces/modules如何处理?
Python不太在意类名,这些会有所不同类,你只需要有一种机制来保存和查找你想要的类。
class A:
def __repr__(self):
return f"{self.__class__.__name__} floor={self.floor}"
@classmethod
def create_subclass(cls, name, attrs):
return type(name, (cls,), attrs)
di_cls = {}
#save them in a dictionary
for i in range(5):
di_cls[i] = A.create_subclass("B", {"func": abs, "floor" : i})
for i, cls in di_cls.items():
print(f"{cls()}")
class config:
#put them in hierarchical namespaces
cls_level1 = A.create_subclass("B", {"func": abs, "floor" : 11})
class level2:
cls_level2 = A.create_subclass("B", {"func": abs, "floor" : 22})
print(f"{config.cls_level1()=}")
print(f"{config.level2.cls_level2()}")
l1 = config.cls_level1()
l2 = config.level2.cls_level2()
print(f"{isinstance(l1, A)=}")
print(f"{isinstance(l2, A)=}")
print(f"{isinstance(l2, config.level2.cls_level2)=}")
print(f"{isinstance(l2, config.cls_level1)=}")
输出:
B floor=0
B floor=1
B floor=2
B floor=3
B floor=4
config.cls_level1()=B floor=11
B floor=22
isinstance(l1, A)=True
isinstance(l2, A)=True
isinstance(l2, config.level2.cls_level2)=True
isinstance(l2, config.cls_level1)=False