簡體   English   中英

Python 創建派生實例 class

[英]Python create instance of derived class

我想要抽象 class Task 和一些派生類,如 TaskA、TaskB,...我需要 static Task 中的方法來獲取所有任務並返回它們的列表。 但問題是我必須以不同的方式獲取每項任務。 我希望任務是通用的,所以當我創建新的 class 例如 TaskC 時,它應該可以在不更改 class 任務的情況下工作。 我應該使用哪種設計模式? 假設每個派生任務都有其唯一 ID 的裝飾器,我正在尋找 function,它將通過 ID 找到 class 並創建它的實例。 python怎么辦?

有幾種方法可以實現這一點。

第一個也是最簡單的方法是使用__new__方法作為工廠來決定應該返回哪個子類。

class Base:
    UUID = "0"
    def __new__(cls, *args, **kwargs):
        if args == "some condition":
            return A(*args, **kwargs)
        elif args == "another condition":
            return B(*args, **kwargs)

class A(Base):
    UUID = "1"

class B(Base):
    UUID = "2"
    
instance = Base("some", "args", "for", "the", condition=True)

在這個例子中,如果你想確保 class 被 uuid 選擇。 你可以替換 if 條件來閱讀類似的內容

if a.UUID == "an argument you passed":
    return A

但它並不是很有用。 既然您知道特定的 UUID,那么您不妨不必費心瀏覽該界面。

因為我不知道你想要裝飾器做什么,所以我想不出集成它的方法。

編輯以解決注意事項:

如果你巧妙地表達你的表情,你不需要每次都更新它。

假設定義因素來自配置文件,上面寫着“使用 class B”

for sub_classs in self.__subclasses__():
    if sub_class.UUID == config.uuid:
        return sub_class(*args, **kwargs) # make an instance and return it

這樣做的問題是 uuid 對我們人類沒有用。 如果我們使用config.name來替換我們在示例中有 uuid 的每個地方,將會更容易理解

我為此奮斗了很多時間,這正是我想要的:

def class_id(id:int):
    def func(cls):
        cls.class_id = lambda : id
        return cls
    return func

def find_subclass_by_id(cls:type, id:int) -> type:
    for t in cls.__subclasses__():
        if getattr(t, "class_id")() == id:
            return t


def get_class_id(obj)->int:
    return getattr(type(obj), "class_id")()



class Task():
    def load(self, dict:Dict) -> None:
        pass

    @staticmethod
    def from_dict(dict:Dict) -> 'Task':
        task_type = int(dict['task_type'])
        t = find_subclass_by_id(Task, task_type)
        obj:Task = t()
        obj.load(dict)
        return obj


    @staticmethod
    def fetch(filter: Dict):
        return [Task.from_dict(doc) for doc in list_of_dicts]

@class_id(1)
class TaskA(Task):
     def load(self, dict:Dict) -> None:
        ...
     ...
 

暫無
暫無

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

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