「Python系列」 Python 之面向對象(二)


「Python系列」 Python 之面向對象(二)

數據屬性

我們可以修改上節中的類並賦予一些屬性。

<code>>>> class MyClass:
... def __init__(self, arg_1, arg_2, arg_3):
... self.x = arg_1
... self._y = arg_2
... self.__z = arg_3
.../<code>

現在這個類有三個屬性:

  • x 賦予值arg_1
  • ._y 賦予值 arg_2
  • .__z 賦予值 arg_3
  • 藉助Python解包機制,可以用更緊湊的形式編寫代碼:

    <code>>>> class MyClass:
    ... def __init __(self,arg_1,arg_2,arg_3):
    ... self.x,self._y,self .__ z = arg_1,arg_2,arg_3
    .../<code>

    屬性名稱中所有這些下劃線(_)的目的是指示“隱私”級別:

    • 通常,可以從對象外部調用和修改不帶下劃線的屬性(例如.x)。
    • 通常,也可以從對象外部調用和修改帶有單個下劃線的屬性(例如._y)。但是,下劃線是該類的創建者強烈建議不要使用此變量的常規標誌。應該僅通過類的功能成員(例如方法和屬性)來調用和修改它。
    • 帶雙下劃線的屬性(例如.__ z)將在名為name mangling的過程中更改名稱(在本例中為._MyClass__z)。也可以使用新名稱從對象外部調用和修改它們。但是,強烈反對這種做法。還應該僅通過類的功能成員使用原始名稱來調用和修改它。

    Python對象的數據屬性通常存儲在名為.__ dict__的字典中,這也是對象的屬性。但是,可以將數據存儲在其他位置。我們可以通過直接調用.__ dict__或使用Python內置函數vars()來獲取它。

    <code>>>> a = MyClass(2,4,8)
    >>> vars(a)
    {'x':2,'_y':4,'_MyClass__z':8}
    >>> a .__ dict__
    {'x': 2,'_y':4,4,'_MyClass__z':8}/<code>

    由於名稱修改,鍵“ _MyClass__z”在那裡,而不是“ __z”。

    我們可以將.__ dict__用作任何其他Python字典。

    這是獲取和更改與數據屬性關聯的值的常規方法:

    <code>>>> a.x
    2
    >>> a._y
    4
    >>> a.__z
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>

    AttributeError: 'MyClass' object has no attribute '__z'
    >>> a.x = 16
    >>> a.x
    16
    >>> vars(a)
    {'x': 16, '_y': 4, '_MyClass__z': 8}/<module>/<stdin>/<code>

    請注意,我們無法訪問a .__ z,因為.__ dict__沒有key __z。


    分享到:


    相關文章: