В моем коде есть метод, который возвращает экземпляр класса, например:
class MyClass:
def fun( self, *args ): # the method
return Props( self, *args )
class Props: # the returned object
def __init__( self, parent, *args ):
self.parent = parent
self.args = args
Чтобы все было организовано, я рассматриваю возможность размещения реквизита внутри MyClass. Затем я хотел бы обойти веселье и напрямую сделать класс методом экземпляра MyClass, например:
class MyClass:
@instancemethod # does not exist!
class fun:
def __init__( self, parent, *args ):
self.parent = parent
self.args = args
Обратите внимание на комментарий - декоратор instancemethod не существует.
Есть ли способ сделать это, то есть превратить вызываемый объект в метод экземпляра? Если я изменю @instancemethod на @classmethod, конструкция сработает, за исключением того, что родителем является класс, а не экземпляр. Я удивлен, что не могу найти ничего о том, что кажется противоположной операцией.
Любопытно, что это прояснилось!
Редактировать:
Кажется, мой вопрос был не ясен. У меня есть забавная функция-член, которая возвращает не одно значение или кортеж, а объект, полный данных. Эти данные генерируются на основе содержимого объекта MyClass и аргументов функции. Мой исходный код делает именно то, что я хочу. Второй код - это то, как я бы предпочел его написать.
Более того, я заметил, что декоратор, которого я ищу, просто следующий:
def instancemethod( cls ):
def f( *args ):
return cls( *args )
return f
Это, конечно, идентично «забавному» методу, который я стремился обойти. Обратите также внимание на то, что тривиальный 'return cls' не идентичен, хотя на первый взгляд может показаться, что это так.
С этим декоратором мое второе определение класса является допустимым и дает желаемый результат, а именно, a.fun() возвращает объект, который (потенциально) инициализируется на основе данных в a:
a = MyClass()
p = a.fun(1,2,3)
print a # <__main__.MyClass instance at 0xb775b84c>
print p.parent # <__main__.MyClass instance at 0xb775b84c>
print p.args # (1, 2, 3)
Это по-прежнему оставляет меня с вопросом, не доступен ли метод экземпляра, определенный здесь, как встроенный в python, потому что это кажется упущением рядом с методом класса и статическим методом. Но, если нет, я думаю, я могу жить с этой конструкцией.
__call__
- person Andrey Sboev   schedule 12.04.2011Proops
определение класса внутрьfun
тела функции - person Andrey Sboev   schedule 12.04.2011