Используя метаклассы, я пытаюсь создать метод экземпляра, упрощая существующий метод экземпляра. Проблема в том, что 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 __
с использованием метаклассов.
Есть идеи, как чтобы сделать это правильно?