Предотвращение передачи атрибутов функции класса self в качестве первого аргумента - PullRequest
1 голос
/ 15 августа 2011

Хорошо, у меня есть класс, в котором одним из атрибутов является функция обратного вызова. Проблема в том, что всякий раз, когда я вызываю его из класса (например, как self.function_attr(), он передается self в качестве первого аргумента. Вот идея того, с чем я работаю:

def callback(a, b):
    # do something with a, b

class A:
    def __init__(self, callback):
        self.callback = callback
        self.callback(1, 2) # Raises a TypeError: takes exactly 2 arguments (3 given)

Я не хочу писать каждую функцию обратного вызова, чтобы self принимал в качестве первого аргумента. Я написал декоратор, который работает вокруг проблемы:

def callback_decorator(func):
    def newfunc(self, *args, **kw):
        return func(*args, **kw)
    return newfunc

но мне интересно, есть ли что-нибудь лучше.

По сути, мой вопрос заключается в следующем: как я могу назвать атрибуты экземпляра моего класса, которые являются функциями без их передачи self в качестве первого аргумента?

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Вам просто нужно сделать статический метод, когда вы привязываете его к классу.

def callback(a, b):
    # do something with a, b

class A:
    def __init__(self, callback):
        # now it won't get passed self
        self.callback = staticmethod(callback)
        self.callback(1, 2)

или

class A:
    def __init__(self, callback):
        self.callback(1, 2)

    # now it won't get passed self
    callback = staticmethod(callback)
0 голосов
/ 15 августа 2011

Насколько я знаю, обертка (как и ваш декоратор) - это самый простой способ. Поскольку у вас уже есть объект для хранения функции, я не стал бы беспокоиться о декораторе. (Обратите внимание, что я унаследовал от object, что вы, вероятно, должны делать, если только вы не хотите поведение класса в старом стиле.)

class A(object):

    def __init__(self, callback):
        self._callback = callback
        self.callback(1,2)


    def callback(self, *args, **kwargs):
        return self._callback(*args, **kwargs)

Это ведет себя так, как вы ожидаете:

>>> def f(x, y):
...     print "X: %s, Y: %s" % (x,y)
... 
>>> mya = A(f)
X: 1, Y: 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...