Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.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_Django - Fatal编程技术网

Python 我可以在每次继承抽象类时运行代码吗?

Python 我可以在每次继承抽象类时运行代码吗?,python,django,Python,Django,我需要为从抽象类继承的所有类连接一个。是否有一种神奇的python方法,比如继承上的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 更新:为了澄清,我需要对每个类运行一次类评估代码,而不是对每个实例/对象运行一次。我们可以为此实现一个解决方案。首先,我们可以生成抽象模型的子类集,例如: 接下来,我们可以对其进行迭代,每次调用一个函数,如: for subclass in get_de

我需要为从抽象类继承的所有类连接一个。是否有一种神奇的python方法,比如继承上的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


更新:为了澄清,我需要对每个类运行一次类评估代码,而不是对每个实例/对象运行一次。

我们可以为此实现一个解决方案。首先,我们可以生成抽象模型的子类集,例如:

接下来,我们可以对其进行迭代,每次调用一个函数,如:

for subclass in get_descendants(AbstractModel):
    # ... do something with that subclass
    pass
然后我们可以将其与每个子类连接:

from django.db.models.signals import post_save

for subclass in get_descendants(AbstractModel):
    post_save.connect(test_signal, sender=subclass)
从django.db.models.signals导入后保存
对于get_子体(AbstractModel)中的子类:

post_save.connect(test_signal,sender=subclass)
是的,确实有[
初始化子类][1]钩子,每次类被子类化时都会触发它

它将使用第一个参数
cls
作为新的子类(而不是原始父类)调用。 正如文档中所述,您甚至可以从子类向钩子传递任意参数

希望这对你有帮助

编辑:这是通过Python版本3.6中的PEP 487[2]添加的。在早期的python版本中,不调用此方法

[1]


[2]

对于python>=3.6,Terseus已经提到了
\uuu init\uu子类\uuuu
ok


对于较旧的python版本,连接到类创建(我的意思是“创建一个新的类对象”)的规范方法是使用一个自定义元类并重写
\uuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法(这是一个广泛

只是想澄清一下,当你说“继承”时,你的意思是“一个子类的对象被实例化”?不是。我的意思是当继承ABC的a类定义被计算时。我只需要为每个类注册一次信号,而不是每个对象!好的,重要的澄清,我希望有人有想法。这似乎适用于每个对象的创建。这不是我需要的。这与
\uuuu new\uuuu
有何不同?您在实例创建中看到的是REPL的输出,而不是打印。另外,请记住您必须调用'super()。\uuuu init\u subclass\uuuuu(),否则它将无法按预期工作。啊哈,我被输出搞糊涂了,您是对的。但是它不依赖于
super()
调用。但是,它确实如此,我当时运行的是3.5。没有3.6中的
super
def test_signal(sender, instance, **kwargs):
    print('{} is saved'.format(instance))
from django.db.models.signals import post_save

for subclass in get_descendants(AbstractModel):
    post_save.connect(test_signal, sender=subclass)