Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 15, 2012 22:51:58

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните поведение!

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



Офлайн

#2 Фев. 15, 2012 23:16:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9991
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните поведение!

>>> 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)
>>>



Офлайн

#3 Фев. 15, 2012 23:21:28

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Объясните поведение!

А что не так?

Офлайн

#4 Фев. 15, 2012 23:39:08

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните поведение!

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

Почему два аргумента?



Офлайн

#5 Фев. 15, 2012 23:55:48

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Объясните поведение!

Malinaizer
Почему два аргумента?
потому что у вас лямбда от двух.

Офлайн

#6 Фев. 16, 2012 08:34:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9991
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните поведение!

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



Офлайн

#7 Фев. 16, 2012 09:15:54

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните поведение!

Спасибо! А можно как то привязать лямбу к атрибуту экземпляра, что бы она стала связаным или не связаным методом?



Отредактировано (Фев. 16, 2012 09:28:52)

Офлайн

#8 Фев. 17, 2012 01:09:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9991
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните поведение!

чтобы метод стал связанным, нужно его в классе определять
а если ты класс менять не хочешь, то делаешь производный класс и меняешь его



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version