2014-12-18 2 views
3

Что не так с кодом? Python возвращает TypeError, когда метод возвращает строку класса.Python возвращает TypeError, когда метод возвращает строку

class window: 
    def __init__(self, title='window'): 
     self.title = title 
    def title(self, title): 
     if title: 
      self.title = title 
     else: 
      return self.title 

window = window() 
window.title('changed') 
print(window.title()) 

Ошибка:

Traceback (most recent call last): 
    File "C:/Users/Danilo/Desktop/pygtk.py", line 10, in <module> 
     window.title('changed') 
TypeError: 'str' object is not callable 
+1

Я подозреваю, что это связано с тем, что вы используете '' 'title''' как имя как переменной, так и функции – wnnmaw

ответ

9

Методы атрибуты тоже. Вы не можете повторно использовать имя title как для метода, так и для атрибута. В вашем случае, вы установите self.title в строку, и это не отозвано:

>>> class window: 
...  def __init__(self, title='window'): 
...   self.title = title 
...  def title(self, title): 
...   if title: 
...    self.title = title 
...   else: 
...    return self.title 
... 
>>> window().title 
'window' 
>>> window().title() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'str' object is not callable 

Python больше не может найти метод на класс, так как экземпляр имеет атрибут с таким же именем.

Переименуйте атрибут; использовать подчеркивание, например:

class window: 
    def __init__(self, title='window'): 
     self._title = title 
    def title(self, title): 
     if title: 
      self._title = title 
     else: 
      return self._title 

Если вы хотите title аргумент быть необязательно, вы должны использовать ключевое слово аргумент:

def title(self, title=None): 
    if title: 
     self._title = title 
    else: 
     return self._title 

Теперь title будет по умолчанию None и ваш if title тест будет правильно работают:

>>> window_instance = window() 
>>> window_instance.title('changed') 
>>> print(window_instance.title()) 
changed 

Обратите внимание, что я также использовал другое имя для экземпляра; вы также не хотите маскировать класс.

Смежные вопросы