2012-05-25 6 views
6

を設定していないコードです:Pythonのプロパティは、ここで

{'doc': 'As name', 'fset': <function fset at 0x10b68e578>, 'fdel': None, 'fget': <function fget at 0x10b68ec08>} 
John 
John 
Bob 
John 

コードfrom here取られる:上記

def Property(func): 
    return property(**func()) 

class A: 
    def __init__(self, name): 
      self._name = name 

    @Property 
    def name(): 
      doc = 'A''s name' 

      def fget(self): 
       return self._name 

      def fset(self, val): 
       self._name = val 

      fdel = None 

      print locals() 
      return locals() 

a = A('John') 
print a.name 
print a._name 
a.name = 'Bob' 
print a.name 
print a._name 

は、次の出力が生成されます。

質問:何が問題なのですか?それは単純なものでなければなりませんが、私はそれを見つけることができません。

注:私は複雑な取得/設定のためにプロパティを必要とします。単純に属性を隠すのではありません。

ありがとうございます。

+0

あなたはfset'は、 'name'の代わりに' _name'で設定していない 'という100%の確信はあり?簡単な間違いをして、あなたの症状を説明します。 –

+0

@MartijnPieters 99.9%このコードで生成されたコードと出力をコピーしました=) – tonytony

+1

@property defを使うのではなく、プロパティを定義するこの奇妙な方法名前(...): "docstr" \ n getter'、 '@name.setter def name(...):setter'? – delnan

答えて

8

documentation for property()状態:

戻る新しいスタイルのクラスのプロパティ属性(オブジェクトから派生するクラス)。

あなたのクラスは新しいスタイルのクラスではありません(あなたはオブジェクトから継承しませんでした)。クラス宣言を次のように変更します。

class A(object): 
    ... 

これは意図したとおりに動作するはずです。

+0

100%正解!それを考えなかっただろう! – jadkik94

+1

Python 3.xの下では、すべてのクラスがデフォルトでは新しいスタイルになっているので、これは問題ではありません(とにかく 'object'からサブクラス化しても問題ありません)。 –

+0

うわー、それは動作します!私は、プロパティ_did_が値を正しく取得するという事実によってさらに混乱しました。そのため、それが失敗したプロパティー関数自体であるとは考えられませんでした。 – tonytony

1

この形式を使用します(上記の投稿): http://docs.python.org/library/functions.html#property

class C(object): 
    def __init__(self): 
     self._name = "nameless" 

    @property 
    def name(self): 
     """I'm the 'name' property.""" 
     return self._name 

    @name.setter 
    def name(self, value): 
     self._name = value 

    @name.deleter 
    def name(self): 
     del self._name 
関連する問題