2012-05-25 98 views
6

下面是代碼:Python的屬性不設置

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 

上方產生以下輸出:

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

代碼取from here

問題:怎麼了?它應該是簡單的,但我找不到它。

注意:我需要屬性來獲取/設置複雜,而不是簡單地隱藏屬性。

在此先感謝。

+0

你是100%肯定,'fset'不設置'name',而不是'_name'?簡單的錯誤,並會解釋你的症狀。 –

+0

@MartijnPieters 99.9%我剛剛複製了代碼和這個代碼產生的輸出=) – tonytony

+1

任何理由做這種奇怪的定義屬性的方式,而不是僅僅使用'@property def name(...):「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

哇,它的工作原理!事實上,我更加困惑的是,property _did_正確地得到了值,所以我不知道它是'property'函數本身失敗的。 – 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