Найти - Пользователи
Полная версия: Объясните поведение!
Начало » Python для новичков » Объясните поведение!
1
Malinaizer
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
>>> 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
А что не так?
Malinaizer
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
Malinaizer
Почему два аргумента?
потому что у вас лямбда от двух.
py.user.next
ты думаешь, там нужен self, а он там не нужен
в документации, скорее всего, описано это
похоже, что твой способ создания просто привязывает к атрибуту экземпляра функцию
как будто ты создал указатель, и поместил в него адрес функции
Malinaizer
Спасибо! А можно как то привязать лямбу к атрибуту экземпляра, что бы она стала связаным или не связаным методом?
py.user.next
чтобы метод стал связанным, нужно его в классе определять
а если ты класс менять не хочешь, то делаешь производный класс и меняешь его
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB