Уведомления

Группа в Telegram: @pythonsu

#1 Май 25, 2012 08:02:44

Shyt_nik
Зарегистрирован: 2012-05-25
Сообщения: 22
Репутация: +  0  -
Профиль   Адрес электронной почты  

__add__

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

в математике я понимаю

y = [1,2,3]
x = y.__add__(4,5) # 1,2,3,4,5

а вот в функций

__add__(self,other) // self + other
# self - через неё же обращается класс к функций что то вроде того (или я не правильно понял) и просто что там можно прибавить??


P.S если не трудно объясните, спасибо

Офлайн

#2 Май 25, 2012 08:26:09

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

__add__

Shyt_nik
y = [1,2,3]
x = y.__add__(4,5) # 1,2,3,4,5
это не работает

__add__ переопределяет операцию сложения
>>> lst = [1, 2, 3]
>>> lst + [4, 5]
[1, 2, 3, 4, 5]
>>> lst.__add__([4, 5])
[1, 2, 3, 4, 5]
>>>

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

пример
>>> 'abc'.upper()
'ABC'
>>> str.upper('abc')
'ABC'
>>>
у строки ‘abc’ вызывается метод .upper()
строка ‘abc’ - экземпляр класса str
у класса str есть метод upper(self)

пример
>>> class List(list):
...     def __add__(self, v):
...         print('self:', self)
...         print('value:', v)
...         return list.__add__(self, v)
... 
>>> lst = List([1, 2, 3])
>>> 
>>> lst + [4, 5]
self: [1, 2, 3]
value: [4, 5]
[1, 2, 3, 4, 5]
>>> 

add
заменил термин “перегружает” на “переопределяет”
перегрузка подразумевает несколько функций с одним именем



Отредактировано py.user.next (Май 26, 2012 07:04:00)

Офлайн

#3 Май 25, 2012 08:52:13

Shyt_nik
Зарегистрирован: 2012-05-25
Сообщения: 22
Репутация: +  0  -
Профиль   Адрес электронной почты  

__add__

ай точно забыл про квадратные скопки извиняюсь.

class FastFunctor(object):
    def __add__(self,obj):

(пример не смог наити вот только урезанный) и что здесь может получиться, понятно создается класс, объект можно создать в __init__ а __add__ что ее дважды прибавит чтоли?

P.S спасибо за помощь

P.S.S ладно видать для это еще рано сам доиду спасибо за помощь

Отредактировано Shyt_nik (Май 25, 2012 09:16:55)

Офлайн

#4 Май 25, 2012 09:29:56

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

__add__

В __add__ можно сделать все что угодно. Поскольку не видно, что там в нем выполняется, то и ответить что это и зачем нельзя. Мне кажется, не стоит заморачиваться конкретно с __add__. Это всего лишь один из переопределяемых методов, частный случай кусочка ООП. Разберитесь с ООП (классы, методы, инкапсуляция, наследование, полиморфизм) и смысл станет понятен.



Офлайн

#5 Май 25, 2012 09:48:59

Shyt_nik
Зарегистрирован: 2012-05-25
Сообщения: 22
Репутация: +  0  -
Профиль   Адрес электронной почты  

__add__

Спасибо за пример всё понял, да я чего то сразу примера не заметил ( нужно зрение проверить )

P.S спасибо всем за помощь, может и правда глубина не нужна, но охота разбрать все нюансы

Офлайн

#6 Май 25, 2012 18:48:13

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

__add__

А всегда class.method(obj) равносильно obj.method(), если obj - экземпляр class?



Офлайн

#7 Май 25, 2012 19:18:29

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

__add__

asilyator
А всегда class.method(obj) равносильно obj.method(), если obj - экземпляр class?
Нет, если method обернут декоратором @staticmethod, @classmethod или method - это какой-то свой хитрый дескриптор, будет другое.
class Foo(object):
    def bar(self, *args):
        print self, args
    
    @classmethod
    def baz(cls, *args):
        print cls, args
        
    @staticmethod
    def qux(*args):
        print args
        
foo = Foo()
Foo.bar(foo)
Foo.baz(foo)
Foo.qux(foo)

Вот здесь хорошо и кратко описано, что происходит при вызове метода: http://stackoverflow.com/a/114289/1052325

Офлайн

#8 Май 26, 2012 07:06:50

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

__add__

есть пример - метод str.maketrans(), который не требует экземпляра

>>> str.maketrans({1: 2})
{1: 2}
>>>



Отредактировано py.user.next (Май 26, 2012 07:08:20)

Офлайн

#9 Май 26, 2012 17:21:25

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

__add__

Пжалста, пишите версию питона. Дефолт питон не обязательно тройка.

Он хоть и не требует, но может вызываться и как статический, и как динамический метод.

str.maketrans({1:2})
“”.maketrans({1:2})



Отредактировано asilyator (Май 26, 2012 17:23:39)

Офлайн

#10 Май 27, 2012 07:18:54

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

__add__

asilyator
Пжалста, пишите версию питона. Дефолт питон не обязательно тройка.
пишу для той, которая является текущей на python.org

license()
    3.0             2.6         2008        PSF         yes
    3.0.1           3.0         2009        PSF         yes
    3.1             3.0.1       2009        PSF         yes
    3.1.1           3.1         2009        PSF         yes
Hit Return for more, or q (and Return) to quit: 
    3.1.2           3.1.1       2010        PSF         yes
    3.1.3           3.1.2       2010        PSF         yes
    3.1.4           3.1.3       2011        PSF         yes
    3.2             3.1         2011        PSF         yes
    3.2.1           3.2         2011        PSF         yes
    3.2.2           3.2.1       2011        PSF         yes
    3.2.3           3.2.2       2012        PSF         yes

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

>>> str.center(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor 'center' requires a 'str' object but received a 'int'
>>> str.center('abc', 10)
'   abc    '
>>>



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version