简体   繁体   中英

Using decorator in a class in python

For understanding decorators in Python, i created in a class an example. But when i run it i receive an error.

class Operation:

    def __init__(self, groupe):
        self.__groupe = groupe

    @property
    def groupe(self):
        return self.__groupe

    @groupe.setter
    def groupe(self, value):
        self.__groupe = value

    def addition(self, func_goodbye):
        ln_house = len('house')
        ln_school = len('school')
        add = ln_house + ln_school
        print('The result is :' + str(add))
        return func_goodbye

    @addition
    def goodbye(self):
        print('Goodbye people !!')


if __name__ == '__main__':
    p1 = Operation('Student')
    p1.goodbye()

I receive this error:

Traceback (most recent call last): File "Operation.py", line 1, in class Operation: File "Operation.py", line 21, in Operation @addition TypeError: addition() missing 1 required positional argument: 'func_goodbye'

You can have a class scoped decorator, however there won't be a self when the decorator is called

a decorator:

@foo
def bar(): ...

is roughly equivalent to

def bar(): ...
bar = foo(bar)

in your particular example, if you remove the self parameter, it should function as you expect:

    def addition(func_goodbye):
        ln_house = len('house')
        ln_school = len('school')
        add = ln_house + ln_school
        print('The result is :' + str(add))
        return func_goodbye

    @addition
    def goodbye(self):
        print('Goodbye people !!')

for good measure, I might del addition after that just to ensure it isn't accidentally called later

(an aside: one unfortunate side-effect of this is many linters and type checkers will consider this "odd" so I've yet to find a way to appease them (for example mypy ))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM