Как найти класс связанного метода во время конструкции класса в Python 3.1?

я хочу записать декоратору, который позволяет методам классов стать видимыми другим сторонам; проблема, которую я описываю, однако, независима от той детали. код будет примерно походить на это:

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?

5
задан SilentGhost 2 February 2010 в 23:16
поделиться

1 ответ

Конечно. В Objective-C отсутствуют фактические конструкторы . init - методы типа обычно используются для инициализации класса в том же ключе, что и конструктор, но они являются просто «нормальным» методом (в них нет ничего особенного, как в конструкторах Java).

Это означает, что, если класс не инициализирует без для своих экземпляров, вы, вероятно, хотите, чтобы имел какой-то метод init .

-121--3665282-
tcpdump port 80 or port 3128

или, в качестве альтернативы,

tcpdump port '(80 or 443)'
-121--1096526-

Когда декоратор вызывается, он вызывается с функцией в качестве аргумента, не метод - поэтому он не будет использовать для декоратора, чтобы исследовать и интроспектировать его метод настолько, насколько он хочет, потому что это только Надеюсь, это решит вашу «загадку», хотя и в негативном смысле!

Могут быть опробованы другие подходы, такие как глубокий самоанализ на вложенных стековых кадрах, но они хакерские, хрупкие и не переносятся на другие реализации Python 3 такие как pynie; Поэтому я от всей души рекомендую избегать их, в пользу решения класса-декоратора, которое вы уже рассматриваете и гораздо чище и прочнее.

7
ответ дан 14 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: