Python面向对象之封装

一、封装

  封装就是指隐藏对象的属性和实现的细节,仅对外公开提供简单的接口。外部不能访问。内部可以正常使用

 

  控制程序中属性的访问权限:Python中权限分为两种:

  1:公开 外界可以直接访问和修改

  2:私有 外界不能直接访问和修改,在当前类中可以直接修改和访问

 

  封装的好处:

    1、为了保护数据的安全 (身份证信息,银行卡密码等)

    2、对外隐藏实现的细节,为了隔离复杂度  (电脑的开机功能等不需要考虑如何实现等)

 

  封装的语法:

    在属性名前添加两个下划线__ 将其设置为私有的

 

  例子:

class Person:
    def __init__(self,name,age,id_number):
        self.__id_number=id_number          # 封装起来 变为私有
        self.age=age
        self.name=name

p = Person("1111111","aaa",20)
p.id_number="22222"
print(p.id_number)              #22222

 

二、外界访问私有内容

  属性虽然被封装了,但是还是需要使用的,可以通过 定义类完成对私有属性对的修改和访问

class People:
    def __init__(self, name):
        self.__name = name
 
    def get_name(self):
        # 通过该接口就可以间接地访问到名字属性
        # print('不让看')
        print(self.__name)
 
    def set_name(self,val):
        if type(val) is not str:
            print('必须传字符串类型')
            return
        self.__name=val
 
# 使用者:aaa
obj = People('aaa')
#print(obj.name)             #此时会报错,因为name是隐藏属性。无法直接用名字属性
obj.get_name()               #访问name只能通过方法。此时结果为aaa

 

三、封装之property装饰器

  作用:将一个方法伪装成普通的属性,其特殊之处在在于,该方法会在修改属性值时自动执行。用来绑定给对象的方法伪造成一个数据属性

  例子:

class People:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):                # obj1.name
        return self.__name

    @name.setter                    #属性内置的,用于修改
    def name(self, val):           # obj1.name='aaa'
        if type(val) is not str:
            print('必须传入str类型')
            return
        self.__name = val

    @name.deleter                   #同上
    def name(self):                    # del obj1.name
        print('不让删除')
        # del self.__name


obj1 = People('aaa')
# 人正常的思维逻辑直接是对象.属性。然而事实上name属性是私有的,所以加上property就可以变为普通型,外界看着就是正常访问
print(obj1.name)             #aaa
obj1.name=18                 #必须传入str类型
del obj1.name                #不让删除

注意:name是被property装饰的方法的名称  也就是属性的名称内部会创建一个对象 变量名称就是函数名称,所以在使用setter和deleter时,必须保证使用的名称取调用方法.所以是name.setterh

 

  2、property实现属性计算

class Square:
    def __init__(self,num):
        self.num=num
    @property             # 让属性装换为普通类 
    def area(self):
        return self.num*self.num
    
s=Square(10)
print(s.area)

#100

 

三、封装原理

  就是在加载类的时候把__替换成了_类名_

#把fa定义成私有的,即__fa
class A:
   def __fa(self): #在定义时就变形为_A__fa
     print('from A')
   def test(self):
     self.__fa() #只会与自己所在的类为准,即调用_A__fa

class B(A):
   def __fa(self):
     print('from B')

b=B()
b.test()
#from A

 

四、接口

  接口是一组功能的集合体,但是接口中仅包含功能的名字,不包含具体的实现代码;接口的本质是一套协议标准,遵循这个标准的对象就能被调用。接口的目的就就是为了提高扩展性

 

五、抽象类

  指的是包含抽象方法(没有函数的方法)的类。可以实现强制性要求子类必须实现父类声明的方法。抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化,且有存在没有实现的方法

# 注意:不能直接实例化抽象类!!!

# 示例程序:

import abc  # 导入abc模块
class InMa(metaclass=abc.ABCMeta):  # 定义抽象方法
    @abc.abstractmethod  # 定义抽象方法
    def login(self):
        pass
    @abc.abstractmethod
    def zhuce(self):
        pass

class Login(InMa):  # 继承抽象类
    def __inti__(self, name, pwd):
        self.name = name
        self.password = pwd

    def login(self):  # 实现抽象方法功能
        if self.name == "qq" and self.password == "111":
            print("恭喜登录成功")
        else:
            print("登录失败")

class Zc(Login):

    def __init__(self, name, pwd):
        self.name = name

        self.password = pwd

    def zhuce(self):
        print("恭喜注册成功")

        print("username:", self.name)

        print("password:", self.password)


# 实例对象
ren = Zc("aaa", "bbb")

ren.zhuce()


'''
恭喜注册成功
username: aaa
password: bbb
'''

 

posted @ 2022-03-30 22:38  新入世界的小白  阅读(326)  评论(0编辑  收藏  举报