私有化
- 封裝
- 私有化屬性
- 定義公有的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)