Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Апрель 6, 2007 14:11:23

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

добавить метод в объект

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

>>> class A1: pass
...
>>> def a_1(self, *args, **kw): print locals()
...
>>> a1=A1()
>>> setattr(a1, 'a_1', a_1)
>>> a1.a_1
<function a_1 at 0xb7d91b54>
>>> a1.a_1()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: a_1() takes at least 1 argument (0 given)
>>> a1.a_1(a1)
{'self': <__main__.A1 instance at 0xb7d9718c>, 'args': (), 'kw': {}}
>>>   



Офлайн

#2 Апрель 6, 2007 14:22:43

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

добавить метод в объект

Видимо такое присвоение только для класса работает, но не для объекта:

>>> class A1: pass

>>> def a_1(self, *args, **kw): print locals()

>>> a1=A1()
>>> a1
<__main__.A1 instance at 0x01293D50>
>>> a1.a_1=a_1
>>> a1.a_1()
Traceback (most recent call last):
File “<interactive input>”, line 1, in ?
TypeError: a_1() takes at least 1 argument (0 given)
>>> del a1.a_1
>>> A1.a_1=a_1
>>> a1.a_1()
{'self': <__main__.A1 instance at 0x01293D50>, ‘args’: (), ‘kw’: {}}



Офлайн

#3 Апрель 6, 2007 14:29:32

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

добавить метод в объект

в том и дело что нужно у объекта…
через декораторы это возможно сделать?
http://www.ragbag.ru/2006/11/07/python_decorators/


проблему решил через потомка - спасибо за помощь!
j2a, OlDer,Striver
спасибо за помощь!



Отредактировано (Апрель 6, 2007 14:40:25)

Офлайн

#4 Апрель 6, 2007 14:34:05

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

добавить метод в объект

Два шага не хватило…

>>> class Klass: pass
>>> def method(*args, **kwargs): print locals()
>>> instance = Klass()
>>> instance
<__main__.Klass instance at 0xb7d146cc>
>>> instance.static_method = method
>>> instance.static_method('arg', keyword='value')
{'args': ('arg',), ‘kwargs’: {'keyword': ‘value’}}
>>> Klass.instance_method = method
>>> instance.instance_method('arg', keyword='value')
{'args': (<__main__.Klass instance at 0xb7d146cc>, ‘arg’), ‘kwargs’: {'keyword': ‘value’}}
>>> instance.__class__.another_instance_method = method
>>> instance.another_instance_method('arg', keyword='value')
{'args': (<__main__.Klass instance at 0xb7d146cc>, ‘arg’), ‘kwargs’: {'keyword': ‘value’}}


Ага. Striver уже написал.

Смысл в том, что к объекту добавляются статичные методы (декоратор staticmethod). К классу - методы экземпляра.



Отредактировано (Апрель 6, 2007 14:41:50)

Офлайн

#5 Апрель 6, 2007 14:35:42

OlDer
От:
Зарегистрирован: 2006-07-19
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

добавить метод в объект

Офлайн

#6 Апрель 8, 2007 09:06:03

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

добавить метод в объект


import new
help(new.instancemethod)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version