2017-09-04 34 views
-1

今、私のクラスにはとてもシンプルなメソッドがありますが、それを呼び出すのは難しいです。常にこの出力につながるPythonのメソッドを呼び出すことができません

print(str(ll.size())) 

def size(self): 
    return self.size 

私が使用するために必要だコールはこれです、私はそれは方法です何度か言われてきた

print(str(ll.size())) 
TypeError: 'int' object is not callable 

I size()メソッドが設定されていますが、私はそれを理解できませんでした。誰かが私にこのように呼び出すことができ、今後の参考のためにその違いを説明する方法を作るための適切な方法を示すことができますか?ありがとう!

+2

'size'メソッドと' size'という名前の整数属性の両方を持つことはできません。彼らは同じ名前です。 'self.size = 1'を設定した場合は、メソッドを番号に置き換えます。 – larsks

+0

問題は非常に簡単です。おそらく整数であるインスタンスフィールド名 'size'と' size'というメソッドもあります。 size属性にアクセスしようとすると、インスタンス属性がメソッドよりも優先されます。修正?属性の名前を変更するだけです。 –

+0

は、属性サイズとメソッドサイズを持っているようです - 属性を '_size'などの名前に変更する方法は本当に必要です – karthikr

答えて

3

クラスにはsizeという2つの属性があります.1つは定義したメソッドで、もう1つはメソッド内から呼び出すプロパティです。

エラーメッセージから、2番目のものが呼び出されることがわかります。したがって、ll.sizeはintであり、ll.size()はそのintを '呼び出し'しています。

メソッドの名前をsize以外の名前に変更し、それが機能するかどうかを確認してください。

1

インスタンス変数名サイズとインスタンスメソッド名サイズの両方を持つことはできません。

どのように区別できますか?ここで

インスタンス変数が優先それは、intので、ない呼び出し可能である(あなたはおそらくあなたの__init__方法でself.size = xを持っているので、あなたのオブジェクト__dict__で最初に現れる)最初の定義だったので。

あなただけの機能を定義せずに、直接属性を使用size値に行うには特別なことは何も持っていない場合:あなたは(ここで私の簡単な例に反して)何かもっと複雑なを作りたい場合は

class Foo: 
     def __init__(self, somearg): 
      # ... 
      self.size = somearg * 3 
>>> foo = Foo(3) 
>>> foo.size 
9 

propertyを使用します。

class Foo: 
    def __init__(self, somearg): 
     # ... 
     self._size = None 
     self._someattr = somearg 
    # ... 
    @property 
    def size(self): 
     if self._someattr > 2: 
      return self._someattr * 3 
     return 1 
>>> foo = Foo(3) 
>>> foo.size 
9 
>>> bar = Foo(2) 
>>> bar.size 
1 

完全財産デコレータの利点はthis tutorial

を読んで理解するために
関連する問題