1. 程式人生 > >python類的私有屬性和公共屬性

python類的私有屬性和公共屬性

對於python而言,類的屬性的可見度只有兩種,public和private。

類的私有屬性便是在前面加上“__”識別符號,而公共屬性則不必。

在類的外面訪問私有屬性會引發異常。

class Base:
    def __init__(self, value):
        self.__value = value

b = Base(5)
print(assert b.__value)

Traceback (most recent call last):
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 19, in <module>
    print(b.__value)
AttributeError: 'Base' object has no attribute '__value'

屬性被私有化,即使繼承他的字類也不能訪問到。

class Parent:
    def __init__(self, value):
        self.__value = value


class Child(Parent):
    def get_value(self):
        return self.__value

child = Child(4)
print(child.get_value())

Traceback (most recent call last):
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 24, in <module>
    print(child.get_value())
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 21, in get_value
    return self.__value
AttributeError: 'Child' object has no attribute '_Child__value'

為何會這樣?因為python會對類的私有屬性做些轉換,以保證private欄位的私密性。當編譯器看到Child.get_value方法要訪問私有屬性時,他會先把__value變換為_Child_value然後再進行訪問,但實際上該私有屬性是_Parent__value。字類無法訪問父類的私有屬性,只是因為訪問的名稱不同。

查詢該物件的屬性字典便知

class Parent:
    def __init__(self, value):
        self.__value = value


class Child(Parent):
    def name(self):
        names = 'yang'

    def get_value(self):
        return self.__value

child = Child(4)
print(child.__dict__)

{'_Parent__value': 4}

python開發的原則還是要少用私有屬性,如果需要保證屬性不重複,可以在其前面加上單個下劃線。

class Parent:
    def __init__(self, value):
        self._value = value


class Child(Parent):
    def get_value(self):
        return self._value

child = Child(4)
assert child._value == 4