Найти - Пользователи
Полная версия: перезагрузка операторов
Начало » Python для новичков » перезагрузка операторов
1
quaker
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, а во втором всё нормально выводит?
Alex_HH
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>
первый случай, у класса не был опеределн метод который бы отображал его текстовое предстваление, а метод адд вы переопредели добавив в него возврат значени, и при вызове этого метода оно возвращалось, как у меня в коде.

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

Гуру поправьте если я не прав, самому интересно.
terabayt
quaker
этот вопрос говорит о том что у вас очень плохая теоретическая основа, ну и практическая тоже
книгу почитайте!
terabayt
Alex_HH
отобрражает сроковое представление класса
объекта правильнее будет
Alex_HH
а метод адд вы переопредели добавив в него возврат значени
не переопределили а назначили
вот если было бы так
class Newclass(int):
вот тогда мы переопределяем
Alex_HH
terabayt, да спасибо. С первым согласен.
А со вторым, ведь когда пишем:
class Newclass():
это равносильно коду:
class Newclass(object):

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

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

код не вызывает ошибок, то есть метод стр все таки есть в классе предке, коим являеться обжект. Или я опять что то путаю?
4kpt_III
Alex_HH
Наследование от object касается только 3.Х. В 2.Х необходимо явно наследовать. Это называется классы нового и старого стиля.
terabayt
эт уже в 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__']
Alex_HH
4kpt_III, у топикастера третий, а я в темы со вторым не лезу, ибо не пользую.
Так я прав или нет?
py.user.next
terabayt
>>> class A():
class A:

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

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

Думаю правильнее было назвать тему перегрузкой операторов а не перезагрузкой операторов.
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