Malinaizer
Фев. 15, 2012 22:51:58
class A:
def __init__(self):
self.a='a'
#A.m=lambda self, x: x*2
a=A()
a.v=lambda self, x: x*2
>>> a.v(z, 2)
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
a.v(z, 2)
NameError: name 'z' is not defined
>>> a.v(b, 2)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
a.v(b, 2)
NameError: name 'b' is not defined
>>> b='b'
>>> a.v(b, 2)
4
>>> a.v("self", 2)
4
>>> a.v(1, 2)
4
py.user.next
Фев. 15, 2012 23:16:59
>>> class A:
... pass
...
>>> A.m = lambda self, x: x * 2
>>>
>>> a = A()
>>> a.m
<bound method A.<lambda> of <__main__.A object at 0xb759ae2c>>
>>> a.m(3)
6
>>> a.m(1, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes exactly 2 positional arguments (3 given)
>>>
s0rg
Фев. 15, 2012 23:21:28
А что не так?
Malinaizer
Фев. 15, 2012 23:39:08
a.v=lambda self, x: x*2
a.v(2)
Traceback (most recent call last):
File “<pyshell#6>”, line 1, in <module>
a.v(2)
TypeError: <lambda>() takes exactly 2 arguments (1 given)
>>> a.v(, 2)
4
Почему два аргумента?
s0rg
Фев. 15, 2012 23:55:48
Malinaizer
Почему два аргумента?
потому что у вас лямбда от двух.
py.user.next
Фев. 16, 2012 08:34:36
ты думаешь, там нужен self, а он там не нужен
в документации, скорее всего, описано это
похоже, что твой способ создания просто привязывает к атрибуту экземпляра функцию
как будто ты создал указатель, и поместил в него адрес функции
Malinaizer
Фев. 16, 2012 09:15:54
Спасибо! А можно как то привязать лямбу к атрибуту экземпляра, что бы она стала связаным или не связаным методом?
py.user.next
Фев. 17, 2012 01:09:11
чтобы метод стал связанным, нужно его в классе определять
а если ты класс менять не хочешь, то делаешь производный класс и меняешь его