Найти - Пользователи
Полная версия: __add__
Начало » Python для новичков » __add__
1 2
Shyt_nik
Здравствуйте, я недавно начал изучать Python и я б хотел понять что это значит во всех книгах пишут но примеров они чего то забыли видать написать при том все.

в математике я понимаю
y = [1,2,3]
x = y.__add__(4,5) # 1,2,3,4,5

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

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


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

py.user.next
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
заменил термин “перегружает” на “переопределяет”
перегрузка подразумевает несколько функций с одним именем
Shyt_nik
ай точно забыл про квадратные скопки извиняюсь.

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

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

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

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

P.S спасибо всем за помощь, может и правда глубина не нужна, но охота разбрать все нюансы
asilyator
А всегда class.method(obj) равносильно obj.method(), если obj - экземпляр class?
reclosedev
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
py.user.next
есть пример - метод str.maketrans(), который не требует экземпляра

>>> str.maketrans({1: 2})
{1: 2}
>>>
asilyator
Пжалста, пишите версию питона. Дефолт питон не обязательно тройка.

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

str.maketrans({1:2})
“”.maketrans({1:2})
py.user.next
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    '
>>>
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