Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中动态定义类型/类?_Python_C_C Preprocessor_Code Generation - Fatal编程技术网

如何在Python中动态定义类型/类?

如何在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

C中,如果要从名称定义类型,可以使用预处理器。比如说,

#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':[]})