python - 覆盖抽象基类属性会影响其他子类吗?

标签 python django django-models django-1.8

如果我更改抽象基类字段的属性,例如

Classname._meta.get_field(fieldname).attribute = 'value'

它是否也会影响其他子类字段?

最佳答案

tl;dr - 更改不会神奇地反射(reflect)回抽象类的先前用法。

取决于您在哪里更改属性。如果您在定义子类之前执行此操作,则更改将反射(reflect)在该特定子类中,但如果您在定义子类之后执行此操作,则不会影响子类的属性。

class Foo(models.Model):
    char = models.CharField(default='world!', max_length=32)

    class Meta:
        abstract = True

class Bar1(Foo):
    pass

print('bar1 -', Bar1._meta.get_field('char').default)

Foo._meta.get_field('char').default = 'hello!'
print('changed to hello!')

class Bar2(Foo):
    pass

print('bar1 -', Bar1._meta.get_field('char').default)
print('bar2 -', Bar2._meta.get_field('char').default)

Foo._meta.get_field('char').default = 'magic!'
print('changed to magic!')

class Bar3(Foo):
    pass

print('bar1 -', Bar1._meta.get_field('char').default)
print('bar2 -', Bar2._meta.get_field('char').default)
print('bar3 -', Bar3._meta.get_field('char').default)

给出以下输出-

bar1 - world!
changed to hello!
bar1 - world!
bar2 - hello!
changed to magic!
bar1 - world!
bar2 - hello!
bar3 - magic!

关于python - 覆盖抽象基类属性会影响其他子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48811381/

相关文章:

python - conda : How to install a python packages from base environment to new environment

python - 如何根据一个数据帧中的列值从另一个数据帧中估算列值

python - 从 pip3、django 和 postgresql 安装 psycopg2 后出现 "1 warning generated"

python - 我必须将 test_*.py 文件放在 Django 中的哪里?

python - 在 Django 中,如何查看用户的所有属性?

python - 为什么我的两个 docker 容器无法通信,即使它们都分别响应?

Python 矩阵表示为 (40000,)

python - Django 可以与 pandas 和 numpy 一起很好地工作吗?

django - 为 Managed=False 模型添加 Django 管理页面

python - Django 教程第 1 部分 'Poll' 对象没有改变