Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 11, 2015 22:32:27

quaker
Зарегистрирован: 2013-07-13
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

перезагрузка операторов

class Newclass:
     def __init__(self, base):
        self.base = base
     def __add__(self, a):
        self.base = self.base + a
        return self.base
a = Newclass(10)
a + 20
print (a)
output:
<__main__.Newclass object at 0x006A4A70> # Я так понимаю это возникает когда нету оператора return, однако я его не забыл поставить
class Newclass:
     def __init__(self, base):
          self.base = base
     def __str__(self):
          return "%s !!! " % self.base
a = Newclass(10)
print (a)
output:
10 !!! # Здесь вывело число
Вопрос: Почему в первом примере пишет адрес класса в памяти за место числа 30, а во втором всё нормально выводит?



Использую Python 3 + komodo edit )

Офлайн

#2 Янв. 11, 2015 22:49:01

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

перезагрузка операторов

class Newclass:
     def __init__(self, base):
        self.base = base
     def __add__(self, a):
        self.base = self.base + a
        return self.base
a = Newclass(10)
print(a + 20)
print (a)
===OUTPUT ===
30
<__main__.Newclass object at 0x986df4c>
первый случай, у класса не был опеределн метод который бы отображал его текстовое предстваление, а метод адд вы переопредели добавив в него возврат значени, и при вызове этого метода оно возвращалось, как у меня в коде.

во втором случае, вы переопределили метод который отобрражает сроковое представление класса, и там все сработало.

Гуру поправьте если я не прав, самому интересно.



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Отредактировано Alex_HH (Янв. 11, 2015 22:54:05)

Офлайн

#3 Янв. 11, 2015 23:15:32

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

перезагрузка операторов

quaker
этот вопрос говорит о том что у вас очень плохая теоретическая основа, ну и практическая тоже
книгу почитайте!



————————————————
-*- Simple is better than complex -*-

Офлайн

#4 Янв. 11, 2015 23:20:59

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

перезагрузка операторов

Alex_HH
отобрражает сроковое представление класса
объекта правильнее будет
Alex_HH
а метод адд вы переопредели добавив в него возврат значени
не переопределили а назначили
вот если было бы так
class Newclass(int):
вот тогда мы переопределяем



————————————————
-*- Simple is better than complex -*-

Офлайн

#5 Янв. 11, 2015 23:37:37

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

перезагрузка операторов

terabayt, да спасибо. С первым согласен.
А со вторым, ведь когда пишем:

class Newclass():
это равносильно коду:
class Newclass(object):

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

class ClassName():
    def __init__(self):
        pass
    # def __str__(self):
    #     return '45'
 
a = ClassName()
print (a.__str__())

код не вызывает ошибок, то есть метод стр все таки есть в классе предке, коим являеться обжект. Или я опять что то путаю?



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Офлайн

#6 Янв. 11, 2015 23:39:54

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

перезагрузка операторов

Alex_HH
Наследование от object касается только 3.Х. В 2.Х необходимо явно наследовать. Это называется классы нового и старого стиля.

Офлайн

#7 Янв. 11, 2015 23:42:38

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

перезагрузка операторов

эт уже в 3 пайтоне

andrey@ubuntu:~$ python3
Python 3.2.3 (default, Feb 27 2014, 21:33:50) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A():
...  pass
... 
>>> b = A()
>>> dir(b)
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> 
andrey@ubuntu:~$ python
Python 2.7.3 (default, Feb 27 2014, 20:00:17) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A():
...  pass
... 
>>> b = A()
>>> dir(b)
['__doc__', '__module__']
>>> b.__str__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute '__str__'
>>> class C(object):
...  pass
... 
>>> d = C()
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Янв. 11, 2015 23:43:52)

Офлайн

#8 Янв. 11, 2015 23:43:17

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

перезагрузка операторов

4kpt_III, у топикастера третий, а я в темы со вторым не лезу, ибо не пользую.
Так я прав или нет?



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Офлайн

#9 Янв. 12, 2015 02:22:21

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

перезагрузка операторов

terabayt
>>> class A():
class A:

Alex_HH
А со вторым, ведь когда пишем:
class Newclass():
Со вторым случаем - да, со вторым питоном - нет. Пишешь неопределённо, можно попутать.

Alex_HH
Так я прав или нет?
Прав, только не надо пустые скобки писать, а то это выглядит, как
if (a > b):
    ...



Отредактировано py.user.next (Янв. 12, 2015 02:25:27)

Офлайн

#10 Янв. 17, 2015 10:37:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

перезагрузка операторов

Маленькое замечание по теме

Думаю правильнее было назвать тему перегрузкой операторов а не перезагрузкой операторов.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version