Создать метод экземпляра в метаклассе с помощью частичного в Python 3

Используя метаклассы, я пытаюсь создать метод экземпляра, упрощая существующий метод экземпляра. Проблема в том, что partial не работает с методом экземпляра. Это простой пример того, чего я пытаюсь достичь:

from functools import partial

class Aclass(object):

    def __init__(self, value):
        self._value = value

    def complex(self, a, b):                                            
        return a + b + self._value

class Atype(type):

    def __new__(cls, name, bases, attrs):
        return super(Atype, cls).__new__(cls, name, (Aclass, ) + bases, attrs)

    def __init__(cls, name, bases, attrs):
        setattr(cls, 'simple', partial(cls.complex, b=1))

class B(metaclass=Atype):
    pass

b = B(10)

print(b.complex(1, 2))
print(b.simple(1))

, а результат:

13
Traceback (most recent call last):
  File "metatest.py", line 22, in <module>
    print(b.simple(1))
TypeError: complex() takes exactly 3 non-keyword positional arguments (1 given)

Я решил использовать замену лямбда:

    setattr(cls, 'simple', partial(cls.complex, b=1))

на:

    setattr(cls, 'simple', lambda self, x: cls.complex(self, x, b=1))

, но это некрасиво и имеет проблемы с необязательными параметрами.

Я мог бы создать этот метод в экземпляре __ init __ , но я думаю, что это имеет больше смысла и более эффективно делать это в классе __ init __ с использованием метаклассов.

Есть идеи, как чтобы сделать это правильно?

7
задан martineau 2 March 2011 в 01:55
поделиться