簡體   English   中英

如何在Python中動態定義類型/類?

[英]How to define a type/class in Python dynamically?

C中 ,如果我想根據名稱定義類型,則可以使用預處理器。 例如,

#define DEFINE_STRUCT(name)        \
    struct My##name##Struct        \
     {                             \
        int integerMember##name;   \
        double doubleMember##name; \
     }

然后我可以像這樣定義一個具體的結構

DEFINE_STRUCT(Useless);

並像這樣使用Useless結構

struct MyUseslessStruct instance;

所以我的問題是

  • 有辦法在Python中實現嗎?

我有以下課程

class ClassName(SQLTable):
    items = []
    def __init__(self, value):
        SQLTable.__init__(self)
        # some common code
        if value in self.items:
            return
        self.items.append(value)

對於每個ClassNameitems的內容將有所不同,所以我想

def defineclass(ClassName):
    class <Substitute ClassName Here>(SQLTable):
        items = []
        def __init__(self, value):
            SQLTable.__init__(self)
            # some common code
            if value in self.items:
                return
            self.items.append(value)

我不想一遍又一遍地重復代碼,如果可能的話,我想生成它。

您非常接近:

def defineclass(ClassName):
    class C(SQLTable):
        items = []
        def __init__(self, value):
            SQLTable.__init__(self)   
            # some common code
            if value in self.items:
                return
            self.items.append(value)
    C.__name__ = ClassName
    return C

如您所見,可以使用占位符名稱定義它,然后分配其__name__屬性。 之后,將其返回,以便您可以根據需要在客戶端代碼中使用它。 請記住,Python類是一個與其他對象一樣多的對象,因此您可以return它,將其存儲在變量中,將其放入字典中,或者定義它后隨便使用。

__name__屬性很方便,主要是因為錯誤消息__name__意義。 您可能實際上並不需要為每個類賦予唯一的名稱。

此特定用例的替代方法是使用子類化:

class Base(SQLTable):
    def __init__(self, value):
        SQLTable.__init__(self)   
        # some common code
        if value in self.items:
            return
        self.items.append(value)

class Thing1(Base): items = []
class Thing2(Base): items = []

通過不在基類上定義items ,可以確保必須將其子類化,並定義每個類的items才能實際使用該類。

kindall的答案非常明確,可能更可取,但是有一個內置函數可以生成類: type 當使用一個參數調用時,它返回對象的類型。 當使用三個參數調用時,它將生成一個新的類型/類。 參數是類名稱,基類和類字典。

def custom_init(self, value):
    SqlTable.__init__(self)
    if value in self.items:
        return
    self.items.append(value)

def defineclass(classname):
    #           __name__   __bases__    __dict__
    return type(classname, (SQLTable,), { '__init__': custom_init,
                                          'items': [] })

暫無
暫無

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

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