Форум сайта python.su
0
Здравствуйте, я недавно начал изучать Python и я б хотел понять что это значит во всех книгах пишут но примеров они чего то забыли видать написать при том все.
в математике я понимаю
y = [1,2,3] x = y.__add__(4,5) # 1,2,3,4,5
__add__(self,other) // self + other
Офлайн
857
Shyt_nikэто не работаетy = [1,2,3] x = y.__add__(4,5) # 1,2,3,4,5
>>> lst = [1, 2, 3] >>> lst + [4, 5] [1, 2, 3, 4, 5] >>> lst.__add__([4, 5]) [1, 2, 3, 4, 5] >>>
>>> 'abc'.upper() 'ABC' >>> str.upper('abc') 'ABC' >>>
>>> 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] >>>
Отредактировано py.user.next (Май 26, 2012 07:04:00)
Офлайн
0
ай точно забыл про квадратные скопки извиняюсь.
class FastFunctor(object): def __add__(self,obj):
Отредактировано Shyt_nik (Май 25, 2012 09:16:55)
Офлайн
20
В __add__ можно сделать все что угодно. Поскольку не видно, что там в нем выполняется, то и ответить что это и зачем нельзя. Мне кажется, не стоит заморачиваться конкретно с __add__. Это всего лишь один из переопределяемых методов, частный случай кусочка ООП. Разберитесь с ООП (классы, методы, инкапсуляция, наследование, полиморфизм) и смысл станет понятен.
Офлайн
0
Спасибо за пример всё понял, да я чего то сразу примера не заметил ( нужно зрение проверить
)
P.S спасибо всем за помощь, может и правда глубина не нужна, но охота разбрать все нюансы
Офлайн
-2
А всегда class.method(obj) равносильно obj.method(), если obj - экземпляр class?
Офлайн
173
asilyatorНет, если method обернут декоратором @staticmethod, @classmethod или method - это какой-то свой хитрый дескриптор, будет другое.
А всегда class.method(obj) равносильно obj.method(), если obj - экземпляр class?
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)
Офлайн
857
есть пример - метод str.maketrans(), который не требует экземпляра
>>> str.maketrans({1: 2}) {1: 2} >>>
Отредактировано py.user.next (Май 26, 2012 07:08:20)
Офлайн
-2
Пжалста, пишите версию питона. Дефолт питон не обязательно тройка.
Он хоть и не требует, но может вызываться и как статический, и как динамический метод.
str.maketrans({1:2})
“”.maketrans({1:2})
Отредактировано asilyator (Май 26, 2012 17:23:39)
Офлайн
857
asilyatorпишу для той, которая является текущей на python.org
Пжалста, пишите версию питона. Дефолт питон не обязательно тройка.
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 ' >>>
Офлайн