1

我正在尝试不同的方法来理解 Python 中的装饰器和函数。以下代码是否正确:

import math
def calculate_area(func):
    def area(a,b):
        return a+b
    return area

class Donut():
    def __init__(self, outer, inner):
        self.inner = inner
        self.outer = outer

    @calculate_area
    @staticmethod
    def area(self):
        outer, inner = self.radius, self.inner
        return Circle(outer).area() - Circle(inner).area()

“staticmenthod”装饰器会告诉内置的默认元类类型(类的类,参见这个问题)不要创建绑定方法吗?是否可以这样做:

Donut.area(4,5)
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
Donut.area(4,5)
TypeError: unbound method area() must be called with Donut instance as first argument      (got int instance instead)

请帮助我理解绑定方法和未绑定方法以及装饰器对它们的影响。

4

1 回答 1

2

只需将 @staticmethod 与您的装饰器交换

import math
def calculate_area(func):
    def _area(a, b):
        return a + b
    return _area

class Donut():
    def __init__(self, outer, inner):
        self.inner = inner
        self.outer = outer

    @staticmethod
    @calculate_area
    def area(cls):
        outer, inner = self.radius, self.inner
        return ""

编辑1:

python解释器需要在另一个装饰器之前添加@staticmethod,因为在创建类类型之前,它需要确定类成员和实例成员。如果你的第一个装饰器是其他任何东西,解释器将此函数称为实例成员。看到这个

编辑2:

it's recommended to use @classmethod instead @staticmethod, for more info see this

于 2012-04-08T20:03:20.953 回答