1、 应用场景及定义方式
①应用场景
在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到
私有属性 就是 对象 不希望公开的 属性
私有方法 就是 对象 不希望公开的 方法
②定义方式
在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
class Women: def __init__(self, name): self.name = name # 不要问女人的年龄 self.__age = 18 def __secret(self): print("我的年龄是%d" % self.__age) a = Women('Alice') print(a) # # 私有属性,外部不能直接访问 # a.__age # 私有方法, 外部不能直接访问 # a.__secret()
02. 伪私有属性和私有方法(科普)
提示:在日常开发中,不要使用这种方式,访问对象的 私有属性 或 私有方法
Python
中,并没有 真正意义 的 私有
在给 属性、方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到
处理方式:在 名称 前面加上 _类名
=> _类名__名称
print(a._Women__age) >> 18 # 私有属性外部不能直接访问 print(a._Women__secret()) >> 我的年龄是18 # 私有方法外部不能直接访问
03.get函数和set函数
解决外部访问私有属性问题
get函数:获取值
set函数:设置值【赋值,传值】
说明:本质都是一个普通成员函数,get函数一般有返回值,set设置参数
class Women: def __init__(self, name): self.name = name # 不要问女人的年龄 self.__age = 18 def setAge(self): self.__age = 18 def getAge(self): return self.__age def __secret(self): print("我的年龄是%d" % self.__age) a = Women('Alice') print(a.getAge()) >> 18
@property装饰器:将一个函数当做变量使用,简化get和set函数
使用:@property装饰器作用于一个函数,相当于get函数
与此同时会生成一个新的装饰器@属性名.setter,相当于set函数用于赋值
注意:@property装饰器只能使用在类中的成员方法中,简化代码,同时保证对参数进行校验
class Person: def __init__(self, name, age): self.__name = name self.__age = age # 注意:函数的命名方式,get函数, # 函数的命名并不是固定的,只要是一个合法的标识符即可, # 但是,一般情况下,使用变量名命名,方便区分 @property def name(self): return self.__name # 注意:函数命名方式:和@property作用的函数名保持一致, # 装饰器的命名方式:@属性名.setter # 相当于是set函数,设置参数,给私有化属性进行赋值 @name.setter def name(self, name): self.__name = name @property def age(self): return self.__age @age.setter def age(self, age): if age < 0: age = 0 self.__age = age p1 = Person("jack", 15) print(p1.name) #>>jack p1.name = 'tom' print(p1.name) #>>tom