三大特性 封装
封装
不想让别人改我的属性 # 干脆不想让你看 # 用户名和密码
广义上的封装 : 把方法和属性根据根据类别装到类中
狭义上的封装 : 私有化的方法和属性
方法\静态变量\实例变量(对象属性)都可以私有化
所谓的私有化 : 就是只能在类的内部可见,类的外部是不能访问或者查看的
私有:
1类中的属性私有
# class Goods: # def __init__(self,name,price): # self.name = name # self.__price = price # 私有属性 # # def get_price(self): # print(self.__price) # # apple= Goods('苹果',5) # print(apple.name) # apple.get_price() # print(apple.__price)
2类中的静态变量私有
# 私有的静态变量 # class Role: # __Country='China' # 静态变量的私有化 # def func(self): # print(self.__Country) # print(Role.__Country) # 报错 : 因为不能再类的外部引用变量 # Role().func()
3类中的方法私有
# 私有的方法 # import hashlib # class Auth: # def __init__(self,user,pwd): # self.username = user # self.password = pwd # # def __md5_code(self): # md5 = hashlib.md5(self.username.encode('utf-8')) # md5.update(self.password.encode('utf-8')) # return md5.hexdigest() # # def login(self): # if self.username == 'alex' and 'ee838c58e5bb3c9e687065edd0ec454f' == self.__md5_code(): # return True # # user = input('>>>') # pwd = input('>>>') # obj = Auth(user,pwd) # obj.__md5_code() # 报错的,私有的方法不能在类的外部被使用 # obj._Auth__md5_code() # 不报错的 # ret = obj.login() # if ret: # print('登陆成功')
所有的私有的变化都是在类的[内部]定义的时候完成的
# 私有化是怎么完成的? # class Goods: # def __init__(self,name,price): # self.name = name # self.__price = price # 私有属性 # # def get_price(self): # print(self.__price) # # def set_num(self): # self.__num = 20 # # apple = Goods('苹果',5) # print(apple.__dict__) # print(apple._Goods__price) # 私有的形成 # 所有的私有的变化都是在类的[内部]定义的时候完成的
私有的这个概念 但凡在类的外面 都不能用
私有的所有内容 :实例变量(对象属性),静态变量(类变量),方法都不能被子类继承
# 私有的属性可以被继承么? 小练习 # class Foo: # def __init__(self): # self.__func() # # def __func(self): # print('in foo') # # class Son(Foo): # def __func(self): # print('in son') # # Son()
# class User:
# def func(self):
# self.__wahaha() 在所有的空间里找不到 _User__wahaha
#
# class VipUser(User):
# def __wahaha(self):
# print('in vip user')
#
# VipUser().func() 报错
# class User: # def __wahaha(self): # print('in user') # # class VipUser(User): # def func(self): # self.__wahaha()
# VipUser().func() # 报错,因为在命名空间中根本不存在一个_VipUser__wahaha
公有的 在类的内部外部随便用
public # 私有的 private 只能在类的内部使用 既不能被继承 也不能在类的外部使用
@property # 把装饰的一个方法伪装成一个属性 一个属性 只让你看 不让你改
# class Goods: # def __init__(self,name,price): # self.name = name # self.__price = price # # @property # def price(self): # return self.__price # # apple = Goods('苹果',5) # print(apple.name) # print(apple.price)
# 私有化 # 把一个属性加上双下划线 __属性名 # 这个属性就连在外面看都看不见了 # 我们实际上有些场景允许别人看,不许改 # __属性 # @property装饰的属性名 # def 属性(): # 我们允许别人看,也允许别人改,但是不能瞎改,有一些要求:数据类型 范围 # __属性 # @property装饰的属性名 # def 属性():return __属性 # @属性.setter # def 属性(self,value): # 加点儿条件 # 修改__属性
# 私有的 :通过过给__名字这样的属性或者方法加上当前所在类的前缀,把属性隐藏起来了
# 只能在本类的内部使用,不能在类的外部使用,不能被继承
# property 把一个方法伪装成属性 # property和私有的两个概念一起用
# 定义一个私有的
# 再定义一个同名共有的方法,被property装饰
# @方法名.setter
# @方法名.deleter