私有变量
- 私有成员:命名使用双下划线开头。
- ·作用:无需向类外提供的成员,可以通过私有化进行屏蔽。·做法:命名使用双下划线开头。
·本质:障眼法,实际也可以访问。
私有成员的名称被修改为:_类名_成员名,可以通过_dict_属
性或dir函数查看。
"""
封装 -- 私有成员
障眼法:修改了私有变量名称
本质: __变量名 --> _类名__变量名
"""
# 1. 私有化实例变量
# 2. 提供两个公开的读写方法
class Wife:
def __init__(self, name="", age=0):
self.name = name
# self.__age = age
self.set_age(age)
def get_age(self):
return self.__age
def set_age(self, value):
if 20 <= value <= 50:
self.__age = value
else:
raise Exception("我不要")
w01 = Wife("宁宁", 25)
w02 = Wife("铁锤", 26)
w01.set_age(27)
print(w01.get_age())
w01.__age = 100
# print(w01.__age)# 私有化
print(w01.__dict__)#查看当前有的实例变量
print(w01._Wife__age)# ????
"""
封装 -- 标准属性
作用:保护实例变量
"""
# 1. 创建实例变量
# 2. 提供两个公开的读写方法(对self.age)
# 3. 使用@property修饰读取方法
# 使用@属性名.setter修改写入方法
class Wife:
def __init__(self, name="", age=0):
self.name = name
self.age = age
@property# 创建property对象,自动绑定下面方法(读取)
def age(self):
return self.__age
@age.setter# 自动绑定下面方法(写入)
def age(self, value):
if 20 <= value <= 50:
self.__age = value
else:
raise Exception("我不要")
w01 = Wife("宁宁", 25)
w01.age = 27
print(w01.age)
print(w01.__dict__)
"""
封装 -- 属性
"""
# 1. 创建实例变量
# 2. 提供两个公开的读写方法
# 3. 创建类变量存储property对象
class Wife:
def __init__(self, name="", age=0):
self.name = name
# self.set_age(age)
self.age = age
def get_age(self):
return self.__age
def set_age(self, value):
if 20 <= value <= 50:
self.__age = value
else:
raise Exception("我不要")
# @property
# def get_age(self):
# return self.__age
# @get_age.setter
# def age(self, value):
# if 20 <= value <= 50:
# self.__age = value
# else:
# raise Exception("我不要")
# 类变量
# property 作用:拦截
age = property(get_age, set_age)
w01 = Wife("宁宁", 25)
w02 = Wife("铁锤", 26)
# w01.set_age(27)
w01.age = 27
print(w01.age)
print(w01.__dict__)
@property
- 公开的实例变量,缺少逻辑验证。私有的实例变量与两个公开的方法相结合,又使调用者的操作略显复杂。而属性可以将两个方法的使用方式像操作变量一样方便。
- 通常两个公开的属性(读、写),保护一个私有的变量。@property负责读取,@属性名. setter负责写入只写:属性名= property(None,写入方法名)
可以运行运行上面的代码体会一下