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
write
division(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)