я хочу записать декоратору, который позволяет методам классов стать видимыми другим сторонам; проблема, которую я описываю, однако, независима от той детали. код будет примерно походить на это:
def CLASS_WHERE_METHOD_IS_DEFINED( method ):
???
def foobar( method ):
print( CLASS_WHERE_METHOD_IS_DEFINED( method ) )
class X:
@foobar
def f( self, x ):
return x ** 2
моя проблема здесь состоит в том что самый момент что декоратор, foobar()
, добирается для наблюдения метода, это еще не является вызываемым; вместо этого, это добирается для наблюдения несвязанной версии его. возможно, это может быть разрешено при помощи другого декоратора на классе, который будет заботиться о том, что должно быть сделано к связанному методу. следующая вещь, которую я попытаюсь сделать, состоит в том, чтобы просто ассигновать украшенный метод с атрибутом, когда это проходит декоратора, и затем используйте декоратора класса или метакласс, чтобы сделать постобработку. если я заставляю это работать, то я не должен решать эту загадку, которая все еще озадачивает меня:
может любой, в вышеупомянутом коде, заполнять значимые строки под CLASS_WHERE_METHOD_IS_DEFINED
так, чтобы декоратор мог на самом деле распечатать класс где f
определяется, момент, он определяется? или та возможность устранена в python 3?
Конечно. В Objective-C отсутствуют фактические конструкторы . init
- методы типа обычно используются для инициализации класса в том же ключе, что и конструктор, но они являются просто «нормальным» методом (в них нет ничего особенного, как в конструкторах Java).
Это означает, что, если класс не инициализирует без для своих экземпляров, вы, вероятно, хотите, чтобы имел какой-то метод init
.
tcpdump port 80 or port 3128
или, в качестве альтернативы,
tcpdump port '(80 or 443)'
-121--1096526- Когда декоратор вызывается, он вызывается с функцией в качестве аргумента, не метод - поэтому он не будет использовать для декоратора, чтобы исследовать и интроспектировать его метод настолько, насколько он хочет, потому что это только Надеюсь, это решит вашу «загадку», хотя и в негативном смысле!
Могут быть опробованы другие подходы, такие как глубокий самоанализ на вложенных стековых кадрах, но они хакерские, хрупкие и не переносятся на другие реализации Python 3 такие как pynie; Поэтому я от всей души рекомендую избегать их, в пользу решения класса-декоратора, которое вы уже рассматриваете и гораздо чище и прочнее.