pythonwin
Апрель 6, 2007 14:11:23
может быть кто-то сталкивался - добавление метода к объекту - попробовал через присваивание атрибуту объекта функции - не получилось, т.к. при вызове этой функции нужно в параметрах указывать сам объект
>>> 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': {}}
>>>
Striver
Апрель 6, 2007 14:22:43
Видимо такое присвоение только для класса работает, но не для объекта:
>>> 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’: {}}
pythonwin
Апрель 6, 2007 14:29:32
в том и дело что нужно у объекта…
через декораторы это возможно сделать?
http://www.ragbag.ru/2006/11/07/python_decorators/проблему решил через потомка - спасибо за помощь!
j2a,
OlDer,
Striverспасибо за помощь!
j2a
Апрель 6, 2007 14:34:05
Два шага не хватило…
>>> 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). К классу - методы экземпляра.
bialix
Апрель 8, 2007 09:06:03
import new
help(new.instancemethod)