gpt4 book ai didi

python - python 中的绑定(bind)函数和装饰器

转载 作者:行者123 更新时间:2023-12-01 06:01:50 25 4
gpt4 key购买 nike

我正在尝试不同的方法来理解 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”装饰器会告诉内置默认元类类型(类的类,参见这个问题)不要创建绑定(bind)方法吗?是否可以这样做:

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)

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

最佳答案

只需将 @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,因为在创建类类型之前,它需要确定类成员和实例成员。如果您的第一个装饰器是其他装饰器,解释器会将此函数称为实例成员。请参阅this

编辑2:

建议使用@classmethod代替@staticmethod,更多信息参见this

关于python - python 中的绑定(bind)函数和装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065963/

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