Почему str не может получить второй параметр, когда __str__ может? - PullRequest
6 голосов
/ 08 сентября 2011

Я решил использовать str для печати содержимого дерева в древовидной структуре, используя что-то вроде

print tree

Все узлы дерева - это объекты пользовательских классов, и я перегружаю их__str__ магический метод для использования str дочерних узлов после таких вкладок t отступа

def __str__ (self,t=0) :`
    return t*'\t' + str(self.label) +':' +'\n'+ str(self.l,t+1)+'\n'+str(self.right,t+1)+'\n'

Однако я не могу вызвать str с этим параметром t, но я могу вызвать node.__ str__(t=4) .Не str, только ярлык к магическому методу? Или это потому, что парсер отклоняет дополнительные параметры для str без проверки магического метода?

PS Меня интересует поведение.Я знаю, что это не лучший способ напечатать дерево, это был взлом;)

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

Представь себе это так.

def str(obj):
    try:
        return obj.__str__()
    except ...:
        ...

То, что __str__ может принимать больше параметров, не означает, что str настроен для передачи этих параметров.

1 голос
/ 08 сентября 2011

Если у вас есть класс C с методом __str__(self, t=0), str(c) вызовет C.__str__(c), который устанавливает t в ноль, как объявлено.str() сам принимает только один аргумент.

...