【发布时间】:2016-02-01 21:52:00
【问题描述】:
所以我有一个父类:
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()
...
并编写一个装饰器来完成同样的任务。
我有两个问题:
- 这是个好主意吗?我是否以预期的方式使用装饰器和函数覆盖?
- 我将如何编写这个装饰器?
【问题讨论】:
-
一行
@call_parent比一行super(Class, self).method(...)好多少,尤其是考虑到后者更传统并且可能更明确和灵活? -
... 并且不会将函数调用的开销添加到方法调用中?
-
我在上面的帖子中对其进行了编辑,但这是因为这些子类是动态生成的,并且因为这些子类也在扩展。我不想一直打电话给
super(Class, self).method(...)。 -
@MichaelDong:一路向下调用
super(Class, self.).method(...)有什么问题?为什么动态生成类会让你更喜欢装饰器? -
@user2357112:我没有充分的理由。如果在装饰器中这样做的想法有问题,我不会这样做。我想看看有没有什么问题。但真正的原因是我必须更改生成类的代码。
标签: python python-2.7 oop