Python - 面向對象編程 - 公共屬性、保護屬性、私有屬性


公共屬性

在 Python 的類里面,所有屬性和方法默認都是公共的

class PoloBlog:
    # 公共屬性
    sum = 0

    # 構造方法
    def __init__(self, name):
        self.name = name

    # 公共方法
    def test(self):
        ...

但Python也可以設置受保護、私有類型的變量or方法

 

私有類型的屬性、方法

  • 在實際開發中,對象的某些屬性或方法可能只希望在對象的內部被使用,而不希望在外部被訪問到
  • 私有屬性:就是對象不希望公開訪問的屬性
  • 私有方法:就是對象不希望公開訪問的方法

 

定義方式,類圖

在屬性、方法名前加兩個下划線就是私有屬性、私有方法了

 

代碼

# 私有屬性、方法
class Person:

    # 構造方法
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    # 實例方法
    def pinrtMsg(self):
        print("name:", self.name, " age:", self.__age)

    # 私有方法
    def __getAge(self):
        print("age is ", self.__age)


person = Person("小菠蘿", 24)
# 直接調用私有屬性、私有方法 - 會報錯
print(person.__age)
print(person.__getAge)



# 輸出結果
    print(person.__age)
AttributeError: 'Person' object has no attribute '__age'

    print(person.__getAge)
AttributeError: 'Person' object has no attribute '__getAge'

 

看看 Pycharm 的代碼聯想

壓根不會聯想,因為是私有屬性、私有方法,不允許在對象外部被使用

 

通過公共方法訪問私有屬性

person = Person("小菠蘿", 24)
person.printMsg()


# 輸出結果
name: 小菠蘿  age: 24

 

類屬性私有化

# 類屬性的私有化
class Person:
    __sum = 0

    @classmethod
    def getSum(cls, num):
        # 調用私有類方法
        cls.__sumAdd(num)
        print(cls.__sum)

    @classmethod
    def __sumAdd(cls, num):
        cls.__ 

 

重點

  • 子類無法訪問父類的私有變量、方法
  • 私有變量只有本類的內部能直接調用
  • But!外部真的不能訪問嗎?

 

偽私有屬性和私有方法

  • 其實 Python 中,並沒有真正意義上的私有,仍然可以在外部訪問私有屬性、私有方法
  • 因為,在給私有屬性、方法命名時,實際是對名稱做了一些特殊處理,使得外界無法訪問到
  • 處理方式:在名稱前面加上 _類名 ,私有屬性、方法就會變成  _類名__名稱 
# 間接調用
class Person:
    __sum = 0

    # 構造方法
    def __init__(self, name):
        self.__name = name

    # 私有方法
    def __getName(self):
        print("name is ", self.__name)


# 調用類私有屬性
print(Person._Person__sum)

person = Person("小菠蘿")

# 調用私有屬性
print(person._Person__name)
# 調用私有方法
person._Person__getName()



# 輸出結果
0
小菠蘿
name is  小菠蘿

無論是類對象還是實例對象,都可以通過 ._類名__名稱 來調用私有屬性、方法,這算是一種間接調用

 

受保護類型的屬性、方法

  • 受保護類型一般會稱為:protect 屬性,學過 Java 的應該都了解
  • 在屬性和方法前加一個下划線就是 protect 類型了,私有類型是兩個下划線
# 受保護類型
class PoloBlog:
    _sum = 0.0

    # 構造方法
    def __init__(self, name):
        self._name = name

    # 保護方法
    def _printName(self):
        print(self._name)

    # 類方法
    @classmethod
    def _classMethod(cls):
        print(cls._sum)


blog = PoloBlog("小菠蘿")
# 打印保護類型的類屬性
print(PoloBlog._sum)

# 打印保護類型的實例屬性
print(blog._name)

# 實例對象調用保護類型的實例方法
blog._printName()

# 實例對象調用保護類型的類方法
blog._classMethod()

# 類對象調用保護類型的類方法
PoloBlog._classMethod()


# 輸出結果
0.0
小菠蘿
小菠蘿
0.0
0.0

 

知識點

  • 父類的 protect 屬性,子類可以繼承
  • 實例對象、類對象都能直接調用 protect 屬性、方法

總的來說,和公共變量沒有什么特別大的區別

  

總結

無論是受保護型變量還是私有變量,其實在外部還是能訪問的,所以並不能真正控制屬性的訪問權限


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM