2014-03-27 76 views
0

我得到的錯誤:無法打印我自己的類的屬性在python

TypeError: 'int' object is not callable

當我嘗試做這樣的事情:

first = Rational() 
print(first.numerator()) 
下面

是我的代碼:

class Rational: 

def __init__(self, numerator=0, denominator=1): 
    self.numerator = numerator 
    self.denominator = denominator 

def numerator(self): 
    return self.numerator 

def denominator(self): 
    return self.denominator 

def __str__(self):  
    return str(self.numerator) + "/" + str(self.denominator) 

看來,python認爲分子的類型爲int,但我認爲我把它作爲一個attrib理性階級的使命。我非常困惑。

感謝您的任何澄清!

+0

你沒有縮進它,你粘貼的方式這裏的代碼是正確的?我現在不在可以運行Python的機器上。 – SidJ

回答

1

你有太多的numerator在你的代碼... ;-) 你一個屬性上__init__方法的第一行,另一種由def numerator(self)定義的方法稱爲numerator。 還有根據你所需要的不同的可能性:

  1. 刪除的方法和使用始終first.numerator
  2. 重命名屬性,使它們沒有衝突。
  3. 使用@property條款,但我不認爲你爲什麼會做,在這種情況下,因爲沒有計算或修改的屬性,
+0

更改屬性名稱的竅門。謝謝! –

+0

完美!如果你認爲它解決了,不要忘了把我的答案標記爲選定的答案。 ;-) 提前致謝! – Javier

1

您正在尋找:

class Rational: 

    def __init__(self, numerator=0, denominator=1): 
     self._numerator = numerator 
     self.denominator = denominator 

    @property 
    def numerator(self): 
     return self._numerator 

然後調用代碼看起來像:

first = Rational() 
print(first.numerator) 

發生了什麼事在你的代碼是Rational.numerator被綁定到你定義的方法在模塊導入時,按照正常情況。但是,您的__init__方法明確指出「創建綁定到此int對象的名爲denominator的實例屬性」。該新實例屬性在具有相同名稱的類屬性之前解析,因此對instance.denominator的任何引用都將解析爲該實例屬性。

我的建議替換,如果你真的想要實現一個getter(這不是特別Pythonic;你已經有一個方法來訪問instance.denominator內置!),是存儲在一個私人命名的變量,並創建一個公開命名的屬性方法,它加載它的值並返回它。

+0

這似乎沒有辦法。仍然得到相同的錯誤。基本上屬性前面的「_」只在類內部是私有的? –

+2

那麼,你必須決定你需要''.numerator'哪個調用語義。它應該像int一樣行爲並返回一個int值,或者它應該像一個函數一樣被調用並被稱爲一個?如果你真的想要函數的語義,請刪除'@ property'修飾符並像'instance.numerator()'一樣訪問它。不過,我個人建議直接訪問'.numerator'和'.denominator'屬性,而不必通過getter方法。 –