Python:创建两个共享相同定义的不同类的优雅方式

时间:2016-03-18 11:37:08

标签: python class

我需要在peewee中创建两个表。表格完全相同,但其中一个是暂时的。

这是表模型的定义:

class my_table(Model):
    user_id = BigIntegerField(primary_key = True)
    created_date = DateTimeField(default=datetime.datetime.now)
    class Meta:
        database = db

现在我还需要创建一个临时表my_table_temp,它是my_table的精确副本。

然而我注意到,如果我my_table_temp = my_table {my} my_table_temp.create_table()我实际上在我的数据库中创建了一个名为my_table的表。

有没有比冗余更好的方法

class my_table(Model):
    user_id = BigIntegerField(primary_key = True)
    created_date = DateTimeField(default=datetime.datetime.now)
    class Meta:
        database = db

class my_table_temp(Model):
    user_id = BigIntegerField(primary_key = True)
    created_date = DateTimeField(default=datetime.datetime.now)
    class Meta:
        database = db

3 个答案:

答案 0 :(得分:3)

为什么不简单地扩展my_table而不做任何其他事情,

class my_table(Model):
    user_id = BigIntegerField(primary_key=True)
    created_date = DateTimeField(default=datetime.datetime.now)

    class Meta:
        database = db

class my_table_temp(my_table):
    pass

答案 1 :(得分:1)

扩展Wojciech的评论,为什么不使用例如

my_table_temp = type("my_table_temp", (my_table,), {} )

或者如果按照建议使用CamelCase,

MyTableTemp = type("MyTableTemp", (MyTable,), {} )

有关使用type动态创建类的详细信息,请参阅此处: https://docs.python.org/3/library/functions.html#type

或使用typeshttps://docs.python.org/3/library/types.html

答案 2 :(得分:1)

这个解决方案怎么样?

def create_table():
    class TableClass(Model):
        user_id = BigIntegerField(primary_key = True)
        created_date = DateTimeField(default=datetime.datetime.now)
        class Meta:
            database = db

    return TableClass

myTable = create_table()
myTempTable = create_table()