1、在类中定义的属性和方法如果不想被公开访问,可以选择隐藏,即为私有属性和私有方法。隐藏的属性和方法只能在类的内部访问。
格式为:名字前面加两个下划线
__属性
__方法
2、而在python中没有绝对的隐藏,可以改变一个访问方式就可以进行访问数据。下面有4种方式:
demo1:非正规获取,实际中不要用这种
class People:
def __init__(self, age):
self.__age = age
def __func(self):
print(f"年龄是{self.__age}岁")
af = People(18)
print(People.__dict__) # '_People__func': <function People.__func at 0x0000026E60C87C10>
print(af.__dict__) # {'_People__age': 18}
print(af._People__age) # 18
af._People__func() # 年龄是18岁
demo2:定义一个公开方法在类外部调用,以获取私有属性和私有方法。实际中也不要用这种
class People:
def __init__(self, age):
self.__age = age # 私有属性
def __desc(self):
print(f"年龄是{self.__age}岁") # 私有方法
def get_age(self):
print(f"属性age:{self.__age}") # 因为私有属性和私有方法只能在类内部访问,这里定义一个可以外部获取它们的方法
self.__desc()
def set_age(self, value): # 修改私有属性age
self.__age = value
print(f"修改age为{self.__age}岁")
af = People(18)
af.get_age() # 属性age:18 年龄是18岁
af.set_age(30) # 修改age为30岁
demo3:通过property()函数代理来获取,修改以及删除隐藏的属性。
class People:
def __init__(self, age):
self.__age = age # 私有属性
def get_age(self): # 获取私有属性,需要有return值
return self.__age
def set_age(self, value): # 设置(修改)是私有属性,需要有一个参数
self.__age = value
def del_age(self): # 删除私有属性,关键字del
del self.__age
age = property(fget=get_age, fset=set_age, fdel=del_age) # 通过property函数赋值给一个变量(一般同私有属性名)
af = People(18) # 实例化对象
print(af.age) # 18 可以直接外部访问age属性
af.age = 30 # 可以外部直接修改age属性
print(af.age) # 30
del af.age # 可以外部直接删除age属性
print(af.age) # 已删除所以会报错
demo4:通过 property装饰器(被装饰的方法名与隐藏属性名一致)。
- @property 装饰的方法是获取属性的方法
- @属性名.setter 装饰的方法是修改属性值的方法
- @属性名.deleter 装饰的方法是删除属性值的方法
class People:
def __init__(self, age):
self.__age = age # 私有属性
@property
def age(self): # 获取私有属性,需要有return值
return self.__age
@age.setter
def age(self, value): # 设置(修改)是私有属性,需要有一个参数
self.__age = value
@age.deleter
def age(self): # 删除私有属性,关键字del
del self.__age
af = People(18) # 实例化对象
print(af.age) # 18 可以直接外部访问age属性
af.age = 30 # 可以外部直接修改age属性
print(af.age) # 30
del af.age # 可以外部直接删除age属性
print(af.age) # 已删除所以会报错
如有不足,欢迎指正。