相关疑难解决方法(0)

如何从基类动态创建派生类

例如,我有一个基类如下:

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需要bc.

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)

我得到了这个工作,但更喜欢另一种方式,即动态创建的类对象.

python inheritance class

83
推荐指数
2
解决办法
7万
查看次数

使用`type`动态创建Django模型

我有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)

python django metaclass python-2.7

4
推荐指数
1
解决办法
944
查看次数

Django:在父模型中存储公共字段

我有一些模型:

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属性自动传递给底层父模型,并Placesave()调用时静默创建模型。SQLAlchemy 可以通过它的多表继承来做到这一点。有没有办法在 Django 中实现相同的目标?

python django inheritance

2
推荐指数
1
解决办法
2854
查看次数

标签 统计

python ×3

django ×2

inheritance ×2

class ×1

metaclass ×1

python-2.7 ×1