Python 为什么不';不是所有方法都从类继承吗?
举个例子:Python 为什么不';不是所有方法都从类继承吗?,python,python-3.x,oop,Python,Python 3.x,Oop,举个例子: Foo类: def包装器(func): def包装(自我): 尝试: 返回函数(自身) 除例外情况外: 提升 最后: print('包装函数中有错误') 退货包装 @包装纸 def分区(自身、x、y): 返回x/y 分类栏(Foo): @包装纸 def乘法(自、x、y): 返回x*y f=Foo() 印刷品(f.分部(5,2)) b=巴() 印刷(b.乘法(3,3)) 错误: Traceback (most recent call last): File "d:\De
Foo类:
def包装器(func):
def包装(自我):
尝试:
返回函数(自身)
除例外情况外:
提升
最后:
print('包装函数中有错误')
退货包装
@包装纸
def分区(自身、x、y):
返回x/y
分类栏(Foo):
@包装纸
def乘法(自、x、y):
返回x*y
f=Foo()
印刷品(f.分部(5,2))
b=巴()
印刷(b.乘法(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
回溯(最近一次呼叫最后一次):
文件“d:\Dev\abc python\count.py”,第18行,在
分类栏(Foo):
文件“d:\Dev\abc python\count.py”,第20行,在条形图中
@包装纸
NameError:未定义名称“包装器”
在继承时,我希望子类将拥有父类的所有方法,我没有找到相反的信息,至少我看不出子类没有继承包装器的原因
是的,我可以将decorators移动到一个单独的文件中并导入它们,也许这会“更正确”,但我想了解它们为什么没有被继承。这些名称都不在类块的作用域中。它们是父类名称空间的成员,因此可在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
或:
这些名称都不在类块的作用域中。它们是父类名称空间的成员,因此可在Foo.wrapper
上找到。这实际上与继承无关。它是继承的,但在执行类定义时,Bar
还不存在。@juanpa.arrivillaga wait,为什么我可以调用Bar
类中的division
方法,但不能使用包装器来完成?我脑子里开始有了一些想法,但我仍然不太明白其中的逻辑。另一个选择是在类定义之后进行修饰,Foo.multiply=Foo.wrapper(Foo.multiply)
您不能从条类定义语句调用除法方法。wrapper
和division
都不在该范围内(这是这里的基本问题)。去吧,试试看。在Bar
writedivision(1,1)
的类定义中,你会得到NameError
@juanpa.arrivillaga我是多么愚蠢。这些方法在类的实例上可用,但它们不在子类的实例中。我的咖啡在哪里谢谢,我想你应该写一个答案。
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)