Это совершенно нормально.
Функция myfunc
заменяется экземпляром wrapper
. Подпись wrapper
является (*args)
. поскольку это связанный метод, первым аргументом является экземпляр MyClass
, который выводится после строки `Wrapper: '.
Что тебя смущает?
Стоит отметить, что если вы используете call
в качестве декоратора из за пределами из MyClass
, он сгенерирует TypeError
. Одним из способов решения этой проблемы является применение к нему декоратора staticmethod
, но тогда вы не сможете вызвать его во время создания класса.
Это немного глупо, но я обращаюсь к тому, как это сделать обоими способами здесь .
обновление после комментария
он получает экземпляр в качестве первого аргумента независимо от того, введете ли вы self
в списке параметров, потому что после создается класс и создается экземпляр экземпляра, это связанный метод . когда вы называете это в форме
@instance.call
def foo(bar):
return bar + 1
расширяется до
def foo(bar):
return bar + 1
foo = instance.call(f)
но учтите, что вы вызываете его в инстансе! автоматически расширится до вызова вида
def foo(bar):
return bar + 1
foo = MyClass.call(instance, f)
Так работают методы. Но вы только определили call
, чтобы принять один аргумент, так что это поднимает TypeError
.
Что касается вызова во время конструирования класса, он работает нормально. но функция, которую она возвращает, получает экземпляр MyClass
, когда it вызывается по той же причине, что я объяснил выше. В частности, любые аргументы, которые вы передаете ему в явном виде, приходят после неявного и автоматического размещения экземпляра, к которому он вызывается, в начале списка аргументов.