2017-08-25 6 views
-3

私はPythonのチュートリアルの本を読んでいて、プロパティについて簡単に説明しました。私が理解しているところでは、クラス属性が要求されると、pythonは属性にアクセスする前にコードを実行できるように属性を返すプロパティメソッドに要求を送ります。しかし、なぜこれが必要なのですか。下の例では、返される属性vにはドット表記でもアクセスできません。なぜ@propertyデコレータをPythonで使うべきですか?

@property 
def value(self): 
    if self.is_face_up: 
     v = BJ_Card.RANKS.index(self.rank) + 1 
     if v > 10: 
      v = 10 
    else: 
     v = None 
    return v 
+2

_返される属性にはドット表記でもアクセスできません。どういう意味ですか? 'YourClass()。value'はうまく動作します。 –

+0

はい私は、変数vのように扱う方法でドット表記法を使うことができるようになったことを知っています。質問を書いたとき、MyClass.vをタイプすることによって変数vを得ることができなかったので混乱しました。これはメソッドを呼び出すだけで必要なわけではありません。 –

答えて

1

すなわち再帰性ゲッターを呼び出して、スタックオーバーフロー原因となるため、属性が機能内部ドット表記でアクセスすることができない。しかし、@propertyの全体のポイントである

class A: 
    @property 
    def x(self): 
     return self.x # StackOverflow 

正確にはを使用して、ドット表記でアクセス可能にします。次のものは同等です:

# Without @property 
class A: 
    def x(self): 
     return 3 

a = A() 
print(a.x()) # prints 3 

# With @property 
class A: 
    @property 
    def x(self): 
     return 3 

a = A() 
print(a.x) # prints 3 
+0

したがって、明確にするために、プロパティデコレータを使用するときは、そのメソッドを属性のように扱います。それはクラスの属性を作成するだけで、それを制御できるようにする方法ですか? –

+1

@IsaacJohnson:はい、 '@ property'は、属性アクセスをメソッド呼び出しに変換し、属性を動的にします。 –

+0

ありがとう、私は困惑しましたが、あなたは本当に私のために物事をクリアしました。 :) –

関連する問題