[英]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;
所以我的問題是
我有以下課程
class ClassName(SQLTable):
items = []
def __init__(self, value):
SQLTable.__init__(self)
# some common code
if value in self.items:
return
self.items.append(value)
對於每個ClassName
, items
的內容將有所不同,所以我想
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.