python-封装方法-封装的实现原理-property装饰器-多态-多态之ABC模块-鸭子类型

一、封装方法

  1. 如何封装方法:给方法名字前面加上双下划线
  2. 封装方法的好处:
    1. 提高安全性
    2. 隔离复杂度(将复杂的内容隔离到内部,外部只留下简单的接口,对于使用者而言,降低难度)
class A:

    def __f1(self):
        print("f1 run")

    def run_f1(self):
        self.__f1()

a = A()
a.run_f1()
# ATM的取款功能
#1.插入银行卡  2.输入密码  3.选择取款金额  4.取款
class ATM:
    def __insert_card(self):
        print("插入银行卡...")

    def __input_pwd(self):
        print("输入密码...")
    def __select_money(self):
        print("选择取款金额...")
    def withdraw(self):
        self.__insert_card()
        self.__input_pwd()
        self.__select_money()
        print("取款成功!....")

atm = ATM()
#外部调用这个简单的接口,就能完成一系列复杂的操作
atm.withdraw()

二、封装的实现原理

class Person:

    def __init__(self,name,sex,age,idCard):
        self.name = name
        self.sex = sex
        self.__age = age
        self.__idCard = idCard

    def get_idCard(self):
        return self.__idCard

    def __test(self):
        pass

    print("aaaaaaaaaa")

p = Person("比尔盖茨","男",20,"322323232332332")
p.__idCard = 'xxxxxxx'
print(p.get_idCard())

print(p.__dict__) #{'name': '比尔盖茨', 'sex': '男', '_Person__age': 20, '_Person__idCard': '322323232332332', '__idCard': 'xxxxxxx'}
print(Person.__dict__)

p.__xxxxxxxxxxxx = 1
print(p.__dict__) #{'name': '比尔盖茨', 'sex': '男', '_Person__age': 20, '_Person__idCard': '322323232332332', '__idCard': 'xxxxxxx', '__xxxxxxxxxxxx': 1}

#通过__dict__ 可以发现
#1.私有的属性和方法名称前自动加上了_类名,python就是通过这样的转换方式来实现封装
#2.只有在类的内部的双下划线才会被自动转换,并且这个转换过程只执行一次
#3.父类中私有的方法,子类中无法使用

子类无法覆盖父类的私有方法:

class  A:
    def f(self):
        self.__f1()   #_A__f1

    def __f1(self):
        print("A  __f1")

class B(A):
    def __f1(self):  # _B__f1
        print("B __f1")

    def f2(self):
        self.f()

b = B()
b.f2()
#之所以无法覆盖是因为子类和父类中的私有方法名称不相同,所以无法覆盖,子类的方法一定子类独有的,因为名称不同

三、property装饰器

  1. 当一些属性的值,不是固定的而是通过计算得来的时候,我们必须为这个属性增加方法才能完成计算。但是一旦使用方法后,该属性的访问就变成了方法的调用,很明显与其他的属性访问方式不同,这样给使用者造成迷惑

  2. property可以将方法伪装成属性,利用这个特点我们也可以将其使用到封装中,之前没有这个装饰器我们需要为私有的属性 提供两个方法,但是这样一来方访问私有属性时的方式就发生了变化

    这时候就可以使用property来进行伪装,使得访问私有属性与访问普通属性的方式一致

  3. 另外property还提供了setter(用于修改属性的值)和deleter(删除属性的值)

BIM案例:

class Person:
    def __init__
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值