gpt4 book ai didi

python - 如何确保在子项在装饰器中覆盖它之前始终调用父方法?

转载 作者:太空宇宙 更新时间:2023-11-04 08:51:07 24 4
gpt4 key购买 nike

所以我有一个父类:

class Parent(Object):
def function(self):
do_something()

还有很多子类:

class Child1(Parent):
def function(self):
do_something_else_1()

class Child2(Parent):
def function(self):
do_something_else_2()

...

我想确保父级 function() 总是在子级 function() 之前被调用,这样每次调用 function() 也调用 do_something() 无论类。现在,我知道我可以做类似的事情:

class Child1(Parent):
def function(self):
super(Child1, self).function()
do_something_else_1()

class Child2(Parent):
def function(self):
super(Child2, self).function()
do_something_else_2()

...

但我不想为每个子类都这样做,因为这些子类是动态生成的,并且因为这些子类本身正在进一步扩展。相反,我想做一些看起来像的事情

class Child1(Parent):
@call_parent
def function(self):
do_something_else_1()

class Child2(Parent):
@call_parent
def function(self):
do_something_else_2()

...

并编写一个装饰器来完成同样的任务。

我有两个问题:

  1. 这是个好主意吗?我是否以预期的方式使用装饰器和功能覆盖?
  2. 我将如何编写这个装饰器?

最佳答案

Is this even a good idea? Am I using decorators and function overriding in their intended way?

如果不了解您系统的详细信息,这个问题很难回答。仅从抽象示例来看它看起来不错,但是用 @call_parent 之类的东西替换显式和清晰的 super() 调用并不是一个好主意。

每个人都知道或很容易找出 super() 的作用,装饰器只会造成混淆。

How would I go about writing this decorator?

不要写装饰器,相反你可以使用 template method :

class Parent(Object):

def function(self):
do_something()
do_something_in_child()

def do_something_in_child():
pass

现在在子类中你只需要覆盖do_something_in_childfunction只保留在Parent中,所以你确定你的 do_something() 总是被调用。

class Child1(Parent):

def do_something_in_child(self):
do_something_else_1():

class Child2(Parent):

def do_something_in_child(self):
do_something_else_2():

class Child3(Parent):
# no override here, function() will do the same what it does in Parent
pass

关于python - 如何确保在子项在装饰器中覆盖它之前始终调用父方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com