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

时间:2017-04-27 09:13:12

标签: python

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

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 方法来模拟一个函数,但它最终是一个类,而不是一个函数。

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

1 个答案:

答案 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