如何在Python中动态定义类型/类?
在C中,如果要从名称定义类型,可以使用预处理器。比如说,如何在Python中动态定义类型/类?,python,c,c-preprocessor,code-generation,Python,C,C Preprocessor,Code Generation,在C中,如果要从名称定义类型,可以使用预处理器。比如说, #define DEFINE_STRUCT(name) \ struct My##name##Struct \ { \ int integerMember##name; \ double doubleMember##name; \ } 然后我可以这样定义一个具体的结构 DEFINE_STRU
#define DEFINE_STRUCT(name) \
struct My##name##Struct \
{ \
int integerMember##name; \
double doubleMember##name; \
}
然后我可以这样定义一个具体的结构
DEFINE_STRUCT(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)
对于每个ClassName
项目的内容将不同,因此我希望
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(类名):
类(SQLTable):
项目=[]
定义初始值(自身,值):
SQLTable.\uuuu init\uuuu(自)
#一些通用代码
如果在self.items中有值:
返回
self.items.append(值)
我不想一遍又一遍地重复代码,如果可能的话,我想生成它。您非常接近:
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
如您所见,您可以使用占位符名称定义它,然后分配它的\uu name\uu
属性。之后,返回它,以便可以在客户端代码中使用它。请记住,Python类与其他类一样是一个对象,因此您可以返回它,将其存储在变量中,将其放入字典中,或者在定义它之后执行任何您喜欢的操作
\uuuu name\uuuu
属性很方便,主要是为了让错误消息有意义。实际上,您可能不需要为每个类指定唯一的名称
此特定用例的另一种选择可能是使用子类化:
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 = []
通过不在基类上定义项
,您可以确保必须对其进行子类化,并为每个类定义一个项
,以实际使用该类。您非常接近:
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
如您所见,您可以使用占位符名称定义它,然后分配它的\uu name\uu
属性。之后,返回它,以便可以在客户端代码中使用它。请记住,Python类与其他类一样是一个对象,因此您可以返回它,将其存储在变量中,将其放入字典中,或者在定义它之后执行任何您喜欢的操作
\uuuu name\uuuu
属性很方便,主要是为了让错误消息有意义。实际上,您可能不需要为每个类指定唯一的名称
此特定用例的另一种选择可能是使用子类化:
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的答案非常清楚,可能更可取,但有一个内置函数来生成类:。当使用一个参数调用时,它返回对象的类型。当使用三个参数调用时,它会生成一个新的类型/类。参数是类名、基类和类dict
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': [] })
kindall的答案非常清楚,可能更可取,但有一个内置函数来生成类:。当使用一个参数调用时,它返回对象的类型。当使用三个参数调用时,它会生成一个新的类型/类。参数是类名、基类和类dict
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': [] })
试试这个:试试这个:有趣的是,我用\uuu name\uuuu
成员来表示其他类中的其他内容,但我从未想过我可以分配给它。正是我想要的。所以每次调用此函数时,项
变量都会不同,即使我传递相同的名称
?是的。类(和函数)定义是在Python中执行的。因此,每次调用函数时,都会得到一个新类。您可以检查他们的id()
以确保。。当然,您可以只使用子类…有趣的是,我使用\uuuu name\uuuu
成员来表示其他类中的其他内容,但我从未想过可以分配给它。正是我想要的。所以每次调用此函数时,项
变量都会不同,即使我传递相同的名称
?是的。类(和函数)定义是在Python中执行的。因此,每次调用函数时,都会得到一个新类。您可以检查他们的id()
以确保。。当然,你可以使用子类……这是我不喜欢Python或C++的一种东西,一个函数应该只做一件事。“所有的都是一个类变量,而不是一个实例变量,是,如果它是用<代码>类型())定义的,它就是一个类变量。例如,<代码>类型(CordNeXT,(SqtLable),{'''.'.'.',' IITT'':'CuthuInIt,'Tea':[]})这是我不喜欢的关于Python或C++的一种东西,一个函数应该做一个,只做一件事.“所有的它都是一个类变量,而不是一个实例变量,是的,如果用<代码> Type())//Cudio定义它,它就是一个类变量.例如,type(classname,(SQLTable,),{'\uu init':custom\u init,'items':[]})