三大特性 封装

封装

不想让别人改我的属性 # 干脆不想让你看     # 用户名和密码

 广义上的封装 : 把方法和属性根据根据类别装到类中

 狭义上的封装 : 私有化的方法和属性

 方法\静态变量\实例变量(对象属性)都可以私有化

 所谓的私有化 : 就是只能在类的内部可见,类的外部是不能访问或者查看的

私有:

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

   

 

posted @ 2019-03-29 15:34  401561993  阅读(188)  评论(0编辑  收藏  举报