Наследование классов и методы print / _str_ () - PullRequest
0 голосов
/ 13 января 2012

Мои извинения еще раз за то, что задали еще один очень младший вопрос.По той или иной причине я пока не могу перейти с Java на Python.Я понимаю, что в Python есть эти встроенные методы, которые помогают пользователю что-то делать.Но мне было интересно, являются ли два следующих фрагмента кода одинаковыми или один «более формальный» в том смысле, что он чаще используется в Java, чем другой.

def _str_()
   print "My name is___"

Еще раз, любой из моих методов может быть совершенно неверным (я думаю, это будут методы " str ". В интересах времени я не выписал имя класса идругие методы / атрибуты. Спасибо заранее.

Ответы [ 3 ]

4 голосов
/ 13 января 2012

Вы не должны определять print, потому что это ключевое слово / встроенная функция.

Функция __str__ используется в классах.Когда экземпляр объекта преобразуется в строку, вызывается эта функция.Такие функции, как print делают это внутренне.Вы также можете позвонить str(my_object_instance).

Обратите внимание на двойные подчеркивания. Одиночный, как в OP, не является чем-то особенным.


Пример(Интерактивный Python):

>>> class A:                                                                                        
...   def __str__(self):                                                                            
...     return "I am an instance of A"                                                              
...                                                                                                 
>>> a_inst = A()                                                                                    
>>> print a_inst                                                                                    
I am an instance of A                                                                               
>>>  

Если у вас есть какие-либо вопросы, оставьте комментарий.

2 голосов
/ 13 января 2012

__str__, __len__, __contains__ и т. Д. Являются протоколами .

Любой __xxx___ имеет особое значение, один опытный питонер ожидает xxx(obj1) вызовов obj1.__xxx__().

Но иногда протокол используется с ключевым словом:

  • 'a' in 'aaaaa' переводится как 'aaaa'.__contains__('a').

  • print obj1 переводится как print obj1.__str__().

Даже если он имеет специальное (поперечное) значение, реализация аналогична любому другому методу, поэтому он может быть переопределен классом-потомком.

0 голосов
/ 13 января 2012

Цели этих методов являются законными (синтаксис не слишком большой) , но какой из них выбрать, зависит от того, что вы пытаетесь сделать.

Возможно, простой пример поможет прояснить некоторые вещи.

Давайте определим User класс:

class User:

    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "My name is %s" % self.name

    def show(self):
        print "My name is %s" % self.name

Примечание: Я изменил имя метода с print на show, потому что в python 2.x print - это ключевое слово, поэтому вы не можете его использовать.

Теперь давайте попробуем класс User, чтобы увидеть разницу между __str__ и show?:

>>> rik = User('Ricky')
>>> rik.show()
My name is Ricky
>>> rik.__str__()
'My name is Ricky'
>>> print rik
My name is Ricky

Код должен объяснить сам.

__str__ ( здесь документация )

__str__ - это Специальное имя метода , что означает, что когда вы вызываете print rik, python ищет rik.__str__, если такой метод определен, то он называется rik.__str__(), и возвращаемая строка будет быть напечатанным.

Основная точка __str__:

  • не следует звонить print
  • и должны вернуть string.

show

С другой стороны, вызов show() напрямую выводит строку (и возвращает None). Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...