2015-06-08 17 views
2

Я просто работаю над примером, чтобы помочь мне узнать, как работает ООП на Python. Вот класс, я работаю с:Понимание ошибки: объект 'str' не является вызываемым

class account(object): 
    def __init__(self,holder,number,balance,credit_line=1500): 
     self.holder=holder 
     self.number=number 
     self.balance=balance 
     self.credit_line=credit_line 

    def deposit(self,amount): 
     self.balance+=amount 

    def withdraw(self,amount): 
     if (self.balance-amount < -self.credit_line): 
      #coverage insufficient 
      return False 
     else: 
      self.balance-=amount 
      return True 

    def balance(self): 
     return self.balance 

    def transfer(self,target,amount): 
     if (self.balance-amount < -self.credit_line): 
      #coverage insufficient 
      return False 
     else: 
      self.balance-=amount 
      target.balance+=amount 
      return True 

А вот программа драйвера я использую, чтобы проверить его:

import account 

john=account.account("John Doe","12345","1000.00") 
res=john.balance() 
print "%r" %res 
john.deposit(1500) 
res=john.balance() 
print "%r" %res 

Я получаю сообщение об ошибке при попытке запустить это:

Traceback (most recent call last): 
    File "banker.py", line 4, in <module> 
    res=john.balance() 
TypeError: 'str' object is not callable 

У кого-нибудь есть идеи, почему это так?

+0

Я бы рекомендовал использовать разные имена, в настоящее время у вас есть две разные вещи с именем 'balance'. – shuttle87

ответ

1

Даже если self.balance определяется как метод в своем классе, он заменяется строкой во время __init__ когда self.blance=balance. Поэтому, когда вы вызываете john.balance() в этом случае, где balance является строкой "1000.00", она возвращает довольно полезную ошибку TypeError: 'str' object is not callable.

Рекомендации:

  1. использовать разные имена для метода и для атрибута.
  2. Похоже, что баланс - это число. Зачем передавать его как строку?
  3. Метод balance в настоящее время просто возвращает значение. На самом деле нет необходимости в методе в текущем примере. Но если вы хотите развить его, чтобы делать все возможное для каждого вызова, конечно, это путь.
+0

О, хорошо, это было источником моих проблем. Я не знаю, почему я помещал 1000,00 в кавычки, когда я создавал экземпляр объекта. Спасибо! – freelancer05

0

Вы не можете дать одно и то же имя методу и атрибуту вашего класса. Вам не нужен метод balance(), и вообще python не использует методы getter и setter для доступа к атрибутам. Class_name.attribute_name возвращает значение Вашего атрибута

def balance(self): 
     return self.balance 
2

Вы маскируете атрибуты своего объекта.

self.balance=balance 

и

def balance(self): 

Python не различает self.balance число и self.balance функция. Независимо от того, что назначено последним, это тот, который придерживается. Дайте каждому атрибуту уникальное имя.

+0

self.balance будет вызывать атрибут, тогда как self.balance() вызовет функцию. как упоминалось в тигрхоке, вы должны переименовать свою функцию и использовать несколько слов, например set_balance (self) – Dap

+0

«self.balance вызовет атрибут, тогда как self.balance() вызовет функцию» - атрибут и функция являются одними и теми же, пока он не будет замаскирован новым значением при инициализации. Когда он определен, 'self.balance' _is_ является атрибутом. Это функция, поэтому ее можно назвать. 'Я.balance' будет вызывать функцию только в том случае, если это свойство '@ property'. Когда объект создается, ссылка, используемая для указания функции, теперь указывает на что-то другое, и функция больше не будет ссылаться на нее. – TigerhawkT3

+0

подробно, что я не понял. вы абсолютно правы – Dap

0

Вы переписали свою функцию balance с вашим атрибутом balance. Вы должны переименовать свой атрибут, например, self._balance.

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