Próbuję dodać dekorator, który dodaje atrybuty wywoływalne do funkcji, które zwracają obiekty nieco inne niż wartość zwracana przez funkcję, ale wykonają tę funkcję w pewnym momencie.Uzyskiwanie dostępu do siebie w atrybucie funkcji
Problem, który napotykam, polega na tym, że kiedy obiekt funkcji jest przekazywany do dekoratora, jest on niezwiązany i nie zawiera niejawnego argumentu self
. Kiedy zadzwonię do utworzonej funkcji atrybutu (tj. string()
), nie mam dostępu do self
i nie mogę przekazać jej do oryginalnej funkcji.
def deco(func):
"""
Add an attribute to the function takes the same arguments as the
function but modifies the output.
"""
def string(*args, **kwargs):
return str(func(*args, **kwargs))
func.string = string
return func
class Test(object):
def __init__(self, value):
self._value = 1
@deco
def plus(self, n):
return self._value + n
Kiedy idę do wykonania atrybut utworzony przez dekoratora, jest to błąd pojawia się, ponieważ args
nie zawiera odniesienia self
.
>>> t = Test(100)
>>> t.plus(1) # Gets passed self implicitly
101
>>> t.plus.string(1) # Does not get passed self implicitly
...
TypeError: plus() takes exactly 2 arguments (1 given)
Czy istnieje sposób na stworzenie takiego dekoratora, który może uzyskać odniesienie do self
? Czy istnieje sposób, aby powiązać dodaną funkcję atrybutu (string()
), aby również zostanie wywołana z niejawnym argumentem self
?
Musisz przekazać wartość 'do' calss w momencie tworzenia! w przeciwnym razie wywoła "TypeError: __init __() pobiera dokładnie 2 argumenty (1 dany)'. – Kasramvd
Interesująca koncepcja. Jeśli chodzi o mnie, mam pewne wątpliwości, że jest to w 100% możliwe, ale będę na pewno sprawdzał odpowiedzi. – agg3l
@Kasramvd Tak, to było literówka w pytaniu, teraz jest naprawione. –