Используя метаклассы, я пытаюсь создать метод экземпляра, упростив существующий метод экземпляра.Проблема в том, что частичное не работает с методом экземпляра.Это простой пример того, чего я пытаюсь достичь:
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))
to:
setattr(cls, 'simple', lambda self, x: cls.complex(self, x, b=1))
но он уродлив и имеет проблемы с необязательными параметрами.
Я мог бы создать этот метод в экземпляре __init__
, но я думаю, что это имеет больше смысла, и этоболее эффективно делать это в классе __init__
, используя метаклассы.
Есть идеи, как это сделать правильно?