Python面向對象之私有屬性和私有方法


1、 應用場景及定義方式

①應用場景

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

  私有屬性 就是 對象 不希望公開的 屬性

  私有方法 就是 對象 不希望公開的 方法

②定義方式

  在 定義屬性或方法時,在 屬性名或者方法名前 增加 兩個下划線,定義的就是 私有 屬性或方法

  

class Women:

    def __init__(self, name):
        self.name = name
        # 不要問女人的年齡
        self.__age = 18

    def __secret(self):
        print("我的年齡是%d" % self.__age)


a = Women('Alice')
print(a)

# # 私有屬性,外部不能直接訪問
# a.__age
# 私有方法, 外部不能直接訪問
# a.__secret()

02. 偽私有屬性和私有方法(科普)

提示:在日常開發中,不要使用這種方式訪問對象的 私有屬性 或 私有方法

Python 中,並沒有 真正意義 的 私有

  在給 屬性方法 命名時,實際是對 名稱 做了一些特殊處理,使得外界無法訪問到

  處理方式:在 名稱 前面加上 _類名 => _類名__名稱

print(a._Women__age)   >> 18 # 私有屬性外部不能直接訪問
print(a._Women__secret())  >> 我的年齡是18  # 私有方法外部不能直接訪問

 03.get函數和set函數

解決外部訪問私有屬性問題

get函數和set函數為自定義函數,為了和封裝概念吻合,命名為getXXX和setXXX

get函數:獲取值

set函數:設置值【賦值,傳值】

說明:本質都是一個普通成員函數,get函數一般有返回值,set設置參數

class Women:

    def __init__(self, name):
        self.name = name
        # 不要問女人的年齡
        self.__age = 18

    def setAge(self):
        self.__age = 18

    def getAge(self):
        return self.__age

    def __secret(self):
        print("我的年齡是%d" % self.__age)


a = Women('Alice')
print(a.getAge())   >> 18

04.@property裝飾器

裝飾器:給函數動態的添加功能,對於類的成員方法也可以使用裝飾器

@property裝飾器:將一個函數當做變量使用,簡化get和set函數

使用:@property裝飾器作用於一個函數,相當於get函數

​ 與此同時會生成一個新的裝飾器@屬性名.setter,相當於set函數用於賦值

注意:@property裝飾器只能使用在類中的成員方法中,簡化代碼,同時保證對參數進行校驗

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    # 注意:函數的命名方式,get函數,
    # 函數的命名並不是固定的,只要是一個合法的標識符即可,
    # 但是,一般情況下,使用變量名命名,方便區分
    @property
    def name(self):
        return self.__name

    # 注意:函數命名方式:和@property作用的函數名保持一致,
    # 裝飾器的命名方式:@屬性名.setter
    # 相當於是set函數,設置參數,給私有化屬性進行賦值
    @name.setter
    def name(self, name):
        self.__name = name

    @property
    def age(self):
         return self.__age

    @age.setter
    def age(self, age):
        if age < 0:
            age = 0
        self.__age = age
p1 = Person("jack", 15)
print(p1.name)     #>>jack
p1.name = 'tom'
print(p1.name)     #>>tom


免責聲明!

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



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