簡體   English   中英

動態創建的同名類

[英]Dynamically created classes with the same name

我正在嘗試使用以下類型在 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__())

這是我在 output 中看到的:

[<class '__main__.B'>, <class '__main__.B'>, <class '__main__.B'>, <class '__main__.B'>, <class '__main__.B'>]

顯然,這不是我的本意。 在這方面有兩個問題:

  1. Python 如何處理同名的多個類?
  2. 什么是處理它的pythonic方式? 當然,我可以在已經存在的子類中查找名稱,但是如何處理命名空間/模塊呢?

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)=}")


output:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM