gpt4 book ai didi

python - 为什么不是所有的方法都继承自该类?

转载 作者:行者123 更新时间:2023-12-04 08:34:00 25 4
gpt4 key购买 nike

举个例子:

class Foo:
def wrapper(func):
def wrapped(self):
try:
return func(self)
except Exception:
raise
finally:
print('Some error in wrapped function')
return wrapped

@wrapper
def division(self, x, y):
return x / y


class Bar(Foo):
@wrapper
def multiplication(self, x, y):
return x * y


f = Foo()
print(f.division(5, 2))

b = Bar()
print(b.multiplication(3, 3))
错误:
Traceback (most recent call last):
File "d:\Dev\abc-python\count.py", line 18, in <module>
class Bar(Foo):
File "d:\Dev\abc-python\count.py", line 20, in Bar
@wrapper
NameError: name 'wrapper' is not defined
继承的时候,我期望子类会拥有父类的所有方法,我没有找到反向信息,至少我看不出为什么 wrapper不被子类继承。
是的,我可以将装饰器移动到一个单独的文件中并导入它们,也许它会“更正确”,但我想了解为什么它们不被继承。

最佳答案

这些名称都不在类块的范围内。它们是父类命名空间的成员,因此可以在 Foo.wrapper 获得。 .这与继承无关。传承,但是 Bar执行类定义时尚不存在。
当您尝试在子类定义语句的类范围内使用它时,这与属于父命名空间的任何属性的工作原理相同。

 In [1]: class Foo:
...: def division(self, x, y): return x/y
...:

In [2]: class Bar(Foo):
...: division(1,1)
...:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-8-03e47cf52ab3> in <module>
----> 1 class Bar(Foo):
2 division(1,1)
3

<ipython-input-8-03e47cf52ab3> in Bar()
1 class Bar(Foo):
----> 2 division(1,1)
3

NameError: name 'division' is not defined
为了解决这个问题,你可以这样做:
class Bar(Foo):

@Foo.wrapper
def multiplication(self, x, y):
return x * y
或者:
class Bar(Foo):

def multiplication(self, x, y):
return x * y

Bar.multiplication = Bar.wrapper(Bar.multiplication)

关于python - 为什么不是所有的方法都继承自该类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64891255/

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