私有化
- 封装
- 私有化属性
- 定义公有的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)