为了更好的封装,我想用同一类中的方法装饰实例方法。
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 方法来模拟一个函数,但它最终是一个类,而不是一个函数。
那么我可以在类范围内访问我的函数吗?
答案 0 :(得分:2)
摆脱@staticmethod
行。您希望some_decorator
的行为类似于普通函数,而不是某种方法。
在类对象本身存在之前,在执行类定义时调用装饰器。类中的常规方法定义实际上只是普通的旧函数,每次将它们作为类实例的属性(将它们转换为绑定方法)时,它们就会动态变为方法。但是在构建类对象本身时,您可以将它们视为普通函数。
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