【python基礎】十二、python 面向對象 私有化

私有化

  • 封裝
  1. 私有化屬性
  2. 定義公有的set、get
  • 優點
    • 進行set爲私有變量賦值時,可以判斷是否合法

普通私有化

# 私有化

class Person(object):
    # __age = 18

    def __init__(self, name, age):
        self.__name = name  # 私有化 外界無法修改
        self.__age = age

    # 定義公有的set get 方法:賦值 取值
    def setAge(self, age):
        if age > 0 and age < 120:
            self.__age = age
        else:
            print('輸入age 年齡參數 不合法')

    def setName(self, name):
        if isinstance(name, str):
            self.__name = name
        else:
            print('請輸入string類型的名字')

    def getName(self):
        return self.__name

    def getAge(self):
        return self.__age

    def __str__(self):
        return '姓名:{} 年齡:{}'.format(self.__name, self.__age)


jam = Person('尚尚', 20)

# print(jam.__age)      # 無法訪問私有
# jam.__age = 21      # 修改失敗

jam.setAge(99)
jam.setName('JamSang')

print(jam.getAge())

# dir() 顯示的,均可以 通過 .方法調用
print(dir(Person))
print(dir(jam))
print(jam.__dir__())    # 同dir(jam)
# 並非真正的私有,仍可以訪問,但不建議
print(jam._Person__age)

使用裝飾器私有化

實際開發中的私有化處理: 裝飾器

class Person(object):
    # __age = 18

    def __init__(self, name, age):
        self.name = name  # 私有化 外界無法修改
        self.__age = age

    def setName(self, name):
        if isinstance(name, str):
            self.name = name
        else:
            print('請輸入string類型的名字')

    def getName(self):
        return self.name

    # 使用裝飾器來進行私有化
    @property  # 這是個類 做的裝飾器
    def age(self):      # 功能同getAge,可以直接調用
        return self.__age

    # @property.setter
    @age.setter         # 此處age是上面@property裝飾的age,功能同 set
    def age(self, age):
        if 0 < age < 120:
            self.__age = age
        else:
            print('輸入age 年齡參數 不合法')

    def __str__(self):
        return '姓名:{} 年齡:{}'.format(self.name, self.__age)

jam = Person('Jam', 18)
print(jam.age)
jam.age = 20
print(jam.age)

在b站學習中

個人主頁

學習鏈接

歡迎 批評 指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章