2015-06-21 66 views
5

的Python爲我們提供了許多可能性的實例/類的屬性,例如:什麼是python屬性get和set命令?

class A(object): 
    def __init__(self): 
     self.foo = "hello" 

a = A() 

有很多種方法訪問/修改的self.foo值:

  1. 直接訪問a.foo
  2. 內字典a.__dict__['foo']
  3. 得到和設置a.__get__a.__set__,當然有兩個是預定義的方法。
  4. 的getAttribute a.__getattribute__
  5. __getattr____setattr__
  6. 也許更多。

在閱讀源代碼時,我總是迷失其最終的訪問順序?當我使用a.foo時,如何知道實際調用哪個方法/屬性?

+1

1.'foo'是*實例屬性*,不是類屬性。 2.由於它不是'@屬性'(或其他描述符),'__get__'和'__set__'不會涉及。 – jonrsharpe

+0

例如'__getattr__'與'__getattribute__',請參閱http://stackoverflow.com/q/3278077/3001761 – jonrsharpe

回答

6

bar = a.foo ...

  1. 調用a.__getattribute__('foo')
  2. 這反過來默認查找a.__dict__['foo']
  3. 或調用foo.__get__()如果A定義。

返回的值將被分配到bar


a.foo = bar ...

  1. 調用a.__getattribute__('foo')
  2. 這反過來默認查找a.__dict__['foo']
  3. 或調用foo如果A.
+0

很好解釋。大。 – Fawzan

+0

這不太準確; '__get__'和'__set__'是描述符,它們存儲在* class *中,因此不會在'a .__ dict__'中找到。 – jonrsharpe

+0

@jonrsharpe在技術上更加正確。 – Amber

1

定義的.__set__(bar)我發現this great post th在對象/類屬性查找上有詳細的解釋。

對於對象屬性查找:

假設類是類和實例是類的實例,評估instance.foobar大致相當於此:

  • 來電類的類型時隙。 getattribute(tp_getattro)。默認是這樣的:
    • 是不是類。 字典有一個foobar項目是一個數據描述符?
      • 如果是,則返回Class的結果。 字典 ['foobar']。 得到(實例,類)。
    • 是否有實例。 字典有一個foobar項目嗎?
      • 如果是,則返回實例。 字典 ['foobar']。
    • 是不是類。 字典有一個不是數據描述符的foobar項目[9]?
      • 如果是,則返回Class的結果。 字典 ['foobar']。 得到(實例,克拉斯)。 [6]
  • 如果屬性仍然沒有被發現,並有一個類。 getattr,調用Class。 getattr('foobar')。

有這個圖示的圖像:

enter image description here

請不要檢查出原來的博客,如果有興趣這給蟒蛇類優秀的解釋,屬性查詢,和元類。

相關問題