gpt4 book ai didi

python - 在python中,我可以访问类范围内的方法(但不能访问函数范围内的方法)

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

为了更好的封装,我想用同一个类中的方法来装饰实例方法。

class SomeClass(object):

@staticmethod
def some_decorator(func):
def wrapped(self):
print 'hello'
return func(self)
return wrapped

@some_decorator
def do(self):
print 'world'

x = SomeClass()
x.do()

但是,这段代码引发了TypeError: 'staticmethod' object is not callable

现在我通过定义一个类并重载其 new 方法来模拟函数来解决这个问题,但它最终是一个类,而不是一个函数。

那么我可以在类范围内访问我的函数吗?

最佳答案

只需删除该 @staticmethod 行即可。您希望 some_decorator 的行为像普通函数,而不是某种方法。

装饰器在类定义执行时、类对象本身存在之前被调用。类中的普通方法定义实际上只是普通的旧函数,每次作为类实例的属性调用它们时,它们都会动态地变成方法(这会将它们变成绑定(bind)方法)。但是,在构建类对象本身时,您可以将它们视为普通函数。

class SomeClass(object):
def some_decorator(func):
def wrapped(self):
print 'hello'
return func(self)
return wrapped

@some_decorator
def do(self):
print 'world'

x = SomeClass()
x.do()

输出

hello
world

顺便说一句,你的装饰器中有一个错误:它返回 wrapped() 而不是 wrapped

<小时/>

正如 chepner 在评论中提到的,我们可以删除 some_decorator ,这样在我们在类定义中使用完它之后,它就不会占用类对象中的空间。 (如果我们不小心尝试调用它,我们会收到错误)。我们可以在类定义之后执行del SomeClass.some_decorator,但在类定义中放置del语句也是完全有效的:

class SomeClass(object):
def some_decorator(func):
def wrapped(self):
print 'hello'
return func(self)
return wrapped

@some_decorator
def do(self):
print 'world'

del some_decorator

关于python - 在python中,我可以访问类范围内的方法(但不能访问函数范围内的方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43653500/

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