2013-06-08 15 views
6

私はPythonの新機能で、Python 3.3.1を使用しています。メソッドの呼び出しと属性へのアクセスの違い

class Parent: # define parent class 
    parentAttr = 100 
    age = 55 

    def __init__(self): 
     print ("Calling parent constructor") 

    def setAttr(self, attr): 
     Parent.parentAttr = attr 

class Child(Parent): 
    def childMethod(self): 
     print ('Calling child method') 

今、私はメソッドとatrributesを区別することができますどのように

c=child 
c.[here every thing will appear methods and attr (age,setAttr)] 

を作成しますか?つまり、いつc.SetAtrr(Argument)c.SetAtrr=valueを使用しますか?

+0

クラスのドキュメントには、呼び出すメソッドと、値を安全に変更できる属性であることがクラスのドキュメントに示されています。 – chepner

答えて

11

メソッドも属性です。彼らは単に呼び出し可能なオブジェクトになる。

>>> def foo(): pass 
... 
>>> callable(foo) 
True 
>>> callable(1) 
False 

あなたがメソッドを呼び出すと、あなたは属性(getattr()操作)を検索し、その結果を呼び出します:

c.setAttr(newvalue) 
オブジェクトが callable() functionを使用して呼び出し可能である場合は、検出することができ

は2つのステップです。 (この場合、クラスの属性を検索し、それを記述子として扱います)属性を検索し、結果のオブジェクトであるメソッドを呼び出します。

あなたは属性に割り当てる

は、あなたが新しい値にその名前を再バインド:

c.setAttr = 'something else' 

setattr()操作になります。

あなたのクラスのインスタンスの属性を取得および設定傍受したい場合は、attribute access hooks__getattr____setattr____delattr__を提供することができます。メソッドオブジェクトを生成しますがインスタンスにメソッドを追加したい場合は、あなたがdescriptor objectとしての機能を処理するために必要があります

、:

>>> class Foo: pass 
... 
>>> foo = Foo() # instance 
>>> def bar(self): pass 
... 
>>> bar 
<function bar at 0x10b85a320> 
>>> bar.__get__(foo, Foo) 
<bound method Foo.bar of <__main__.Foo instance at 0x10b85b830>> 

function.__get__()の戻り値、与えられましたインスタンスとクラスは、バインドされたメソッドです。そのメソッドを呼び出すと、インスタンスにバインドされたselfの基底関数が呼び出されます。

また、記述子については、property() functionも記述子を返します。の動作はと同じです。彼らはその属性のgetattr()setattr()delattr()操作をインターセプトし、関数呼び出しにそれを回すことができます:.barへのアクセス

>>> class Foo: 
...  @property 
...  def bar(self): 
...   return "Hello World!" 
... 
>>> foo = Foo() 
>>> foo.bar 
"Hello World!" 

は、元barメソッドを呼び出すbarプロパティのgetフックを、呼び出されました。

ほとんどすべての状況で、callable()機能は必要ありません。あなたのAPIを文書化し、メソッドと属性を提供します。あなたのAPIのユーザーは、それぞれの属性をテストせずに呼び出すことができるかどうかを調べます。プロパティを使用すると、実際に呼び出し可能な属性を柔軟に提供できます。

+0

です。私はc.SetAtrr = valueとc.SetAtrr(Value)を使用できますか?それらは同じでしょうか? – D007a

+0

@disasterromio:いいえ、1つは属性を設定し、もう1つは関数を呼び出しています。 –

+0

UR時間ありがとうございました あなたはベストプラクティスがオブジェクトが呼び出し可能かどうかをチェックすることですか? – D007a

関連する問題