例如,我有一个基类如下:
class BaseClass(object):
def __init__(self, classtype):
self._type = classtype
Run Code Online (Sandbox Code Playgroud)
从这个课程中我得到了其他几个类,例如
class TestClass(BaseClass):
def __init__(self):
super(TestClass, self).__init__('Test')
class SpecialClass(BaseClass):
def __init__(self):
super(TestClass, self).__init__('Special')
Run Code Online (Sandbox Code Playgroud)
是否有一种不错的pythonic方法可以通过函数调用动态创建这些类,该函数调用将新类放入当前范围,如:
foo(BaseClass, "My")
a = MyClass()
...
Run Code Online (Sandbox Code Playgroud)
因为我会需要这样的注释和问题:派生类都具有完全相同的内部结构,区别在于构造函数采用了许多以前未定义的参数.因此,举例来说,MyClass需要的关键字a,而类的构造函数TestClass需要b和c.
inst1 = MyClass(a=4)
inst2 = MyClass(a=5)
inst3 = TestClass(b=False, c = "test")
Run Code Online (Sandbox Code Playgroud)
但是他们永远不应该使用类的类型作为输入参数
inst1 = BaseClass(classtype = "My", a=4)
Run Code Online (Sandbox Code Playgroud)
我得到了这个工作,但更喜欢另一种方式,即动态创建的类对象.
我有20个+ MySQL表,prm_a,prm_b,...有相同的基本结构,但不同的名字,我想不用写每一个用手工将它们与Django的模型类相关联.所以,感到雄心勃勃,我以为我会尝试使用type()作为一个班级工厂:
以下作品:
def get_model_meta_class(prm_name):
class Meta:
app_label = 'myapp'
setattr(Meta, 'db_table', 'prm_%s' % prm_name)
return Meta
prm_class_attrs = {
'foo': models.ForeignKey(Foo),
'val': models.FloatField(),
'err': models.FloatField(blank=True, null=True),
'source': models.ForeignKey(Source),
'__module__': __name__,
}
###
prm_a_attrs = prm_class_attrs.copy()
prm_a_attrs['Meta'] = get_model_meta_class('a')
Prm_a = type('Prm_a', (models.Model,), prm_a_attrs)
prm_b_attrs = prm_class_attrs.copy()
prm_b_attrs['Meta'] = get_model_meta_class('b')
Prm_b = type('Prm_b', (models.Model,), prm_b_attrs)
###
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试生成模型类如下:
###
prms = ['a', 'b']
for prm_name in prms:
prm_class_name = 'Prm_%s' % prm_name
prm_class = type(prm_class_name, …Run Code Online (Sandbox Code Playgroud) 我有一些模型:
class Place(models.Model):
name = models.CharField(unique=True)
class Bar(Place):
drinks = models.ManyToManyField('Drink')
class Restaurant(Place):
meals = models.ManyToManyField('Meals')
Run Code Online (Sandbox Code Playgroud)
那是一个多桌继承结构,每个酒吧只提供饮料,每个餐厅只提供餐点。但是,我需要每个地方的名称在所有地方都是唯一的 - 因此是父Place模型。
现在,多表继承假定父项和子项是独立的实体。这意味着当我想创建一个 new 时Bar,我应该像这样:
>> parent = Place(name='Myplace')
>> parent.save()
>> child = Bar(place=parent, drinks=mydrinklist)
>> child.save()
Run Code Online (Sandbox Code Playgroud)
但就我而言,Place它不是一个单独的实体:它不应该单独存在。它只是一个有一些限制的共享存储。我想要这样的东西:
>> child = Bar(name='Myplace', drinks=mydrinklist)
>> child.save()
Run Code Online (Sandbox Code Playgroud)
其中name属性自动传递给底层父模型,并Place在save()调用时静默创建模型。SQLAlchemy 可以通过它的多表继承来做到这一点。有没有办法在 Django 中实现相同的目标?