首页 > 其他分享 >封装、继承、多态

封装、继承、多态

时间:2024-01-04 16:33:07浏览次数:23  
标签:__ f1 封装 name 继承 self 多态 print def

封装、继承、多态

1.封装

  • 封装就是将属性隐藏,不让外界发现或使用
  • 将可以允许外界使用的内容通过接口开发,让用户通过接口使用
  • 隐藏属性的方法是通过 __变量名

1.1封装之隐藏属性

  • 隐藏数据属性
class Teacher:
    def __init__(self, name, age):
        # 将名字和年纪都隐藏起来
        self.__name = name
        self.__age = age

    # 对外提供访问老师信息的接口
    def tell_info(self):
        print('姓名:%s,年龄:%s' % (self.__name, self.__age))

    # 对外提供设置老师信息的接口,并附加类型检查的逻辑
    def set_info(self, name, age):
        if not isinstance(name, str):
            raise TypeError('姓名必须是字符串类型')
        if not isinstance(age, int):
            raise TypeError('年龄必须是整型')
        self.__name = name
        self.__age = age


# 实例化类得到对象
teacher = Teacher("serein", 18)
# 查看对象的信息
teacher.tell_info() # 姓名:serein,年龄:18

# 调用对象的方法修改对象的信息 , 符合要求就能修改成功
teacher.set_info('formerly', 22)

# 查看对象的信息
teacher.tell_info() # 姓名:formerly,年龄:22
  • 隐藏函数属性
class ATM:
    # 插卡
    def __card(self):
        print('插卡')

    # 身份认证
    def __auth(self):
        print('用户认证')

    # 输入金额
    def __input(self):
        print('输入取款金额')

    # 打印小票
    def __print_bill(self):
        print('打印账单')

    # 取钱
    def __take_money(self):
        print('取款')

    # 取款功能
    def withdraw(self):
        self.__card()
        self.__auth()
        self.__input()
        self.__print_bill()
        self.__take_money()


obj = ATM()
obj.withdraw()
# 插卡
# 用户认证
# 输入取款金额
# 打印账单
# 取款

1.2 property装饰器

class Foo:
    def __init__(self, val):
        # 将属性隐藏
        self.__NAME = val

    @property
    def name(self):
        print(f'我在获取的时候被触发了')
        return self.__NAME

    @name.setter  # 设置值
    def name(self, value):
        print(f'我再修改的时候被触发了')
        # 在设定值之前进行类型检查
        if not isinstance(value, str):
            raise TypeError('%s must be str' % value)
        # 通过类型检查后,将值value存放到真实的位置self.__NAME
        self.__NAME = value

    @name.deleter  # 删除值
    def name(self):
        print(f'删除的时候调用了我')
        raise PermissionError('Can not delete')


f = Foo('serein')
# print(f.name)

# 触发name.setter装饰器对应的函数name(f,'formerly')
f.name = 'formerly'
print(f.name)
# 触发name.setter对应的的函数name(f,123),抛出异常TypeError
f.name = 123

# 触发name.deleter对应的函数name(f),抛出异常PermissionError
del f.name

2.继承

  • 子类可以继承父类中的方法和类变量(不是拷贝一份,父类的还是属于父类,子类可以继承而已)
  • 父类也可以叫基类,子类也可以叫派生类
class Base:

    def func(self):
        print("Base.func")

class Son(Base):
    
    def show(self):
        print("Son.show")
        
s1 = Son()
s1.show() # Son.show
s1.func() # 优先在自己的类中找,自己没有才去父类。
# Base.func

2.1 属性查找顺序

class Base:
    def f1(self):
        print('before')
        self.f2() # slef是obj对象(Foo类创建的对象) obj.f2
        print('base.f1')
        
	def f2(self):
        print('base.f2')
        
class Foo(Base):
    def f2(self):
        print('foo.f2')
        
obj = Foo()
obj.f1() # 优先去Foo类中找f1,因为调用f1的那个对象是Foo类创建出来的。


>>> before
>>> foo.f2
>>> base.f1

b1 = Base()
b1.f1()

>>> before
>>> base.f2
>>> base.f1

查找总结

  • 执行对象.方法时,优先去当前对象所关联的类中找,没有的话才去她的父类中查找。
  • Python支持多继承:先继承左边、再继承右边的。
  • self到底是谁?去self对应的那个类中去获取成员,没有就按照继承关系向上查找 。

2.2 隐藏属性

class Foo:
    # 变形为_Foo__fa
    def __f1(self):
        print('Foo.f1')

    def f2(self):
        print('Foo.f2')
        # 变形为self._Foo__fa,因而只会调用自己所在的类中的方法
        # _Foo__f1
        self.__f1()
        #
        self._Bar__f1()


class Bar(Foo):
    # 变形为_Bar__f1
    def __f1(self):
        print('Bar.f1')

# _Bar__f1
b = Bar()
# 在父类中找到f2方法,进而调用b._Foo__f1()方法,同样是在父类中找到该方法
b.f2()

# 隐藏属性 : 隐藏给当前类,除了当前类,其他继承的子类均不能找到我隐藏的属性

标签:__,f1,封装,name,继承,self,多态,print,def
From: https://www.cnblogs.com/Formerly/p/17945571

相关文章

  • 单调栈分类、封装和总结
    作者推荐map|动态规划|单调栈|LeetCode975:奇偶跳通过枚举最小(最大)值不重复、不遗漏枚举所有子数组C++算法:美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right,[left,right]直接的高度都是maxHeight[i]可以用封装的类,可以理解为枚举山顶这个子数组【单调栈]LeetCode8......
  • Java 中的继承
    继承:可以基于已存在的类构造一个新类,继承已存在的类就是复用(继承)这些类的方法和域,在此基础上,还可以添加一些新的方法和域。1. 继承性 继承性: 把多种有着共同特性的多的类事物抽象成一个类,这个类就是多个类的父类。父类的意义在于可以抽取多个类的共性,代码复用,减少代码量。例:三个......
  • 35 VIVADO用户IP软件总线接口封装
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述使用VIVADO基于图形化创新编程FPGA的方式可以大大提高FPGA编程效率,但是前提是把代码打包成图形化的IP......
  • 【vue】,封装的table组件,table表格超出高度自适应滚动效果,设置页面全局统一自适应高度
    需求背景:为了使后台页面的table列表页面始终保持统一的高度,无论我们的列表数据有多少都只占一个屏幕的高度,如果table表格的数据太多,只滚动table表格的数据,页面高度保持不变;使用window.onresize监听浏览器的高度://tableHeight:为el-table绑定的height高度;onMounted......
  • 34 VIVADO自定义IP简单封装方法
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述XILINX作为FPGA全球老大,不仅仅是硬件技术实力,而且EDA软件也是非常优秀,XILINXVIVADO是业内最先进的开......
  • TS MQTT封装
    TSMQTT封装导入相关包npmimqttnpmilodashguid随机生成就行,具体可以参考百度或者随便生成一个随机数*代码封装importmqttfrom'mqtt'importtype{MqttClient,OnMessageCallback,IClientOptions,IClientPublishOptions,IPublishPacket}from'mqtt'impor......
  • 包&封装&继承总结
    总结包package概念概念:简单的理解包就是一个文件夹。包作用①方便管理项目中的类等文件。②可以避免类名冲突的问题。使用包定义包包命名规范:一般是公司域名反写.项目名.模块名字.子模块名;要求:包名是全英文小写。packagecn.itsource.packagedemo;//声明包导入包......
  • PC9094超小体积封装可编程过流过压保护IC
    概述:PC9094过电压和过电流保护该器件具有低80mΩ(TYP)导通电阻集成MOSFET,主动保护低电压系统的电压供应故障高达+29V直流电。输入电压超过过电压阈值将导致内部MOSFET关闭,防止损坏下游的过大电压设备。过电压保护阈值默认为6V。2.3V/3.6V/11V/16V/23V还有其他版本OVP和无OVP。PC9094......
  • Java-继承:重载与重写的区别
    一、重写(Override)子类继承父类,子类重写父类中的所有公共方法,覆盖父类的方法并对其重写。注意事项:重写前后方法名相同;参数列表相同;返回值相同子类重写的方法所抛出的异常必须与父类中的被重写方法的异常一致,或者不能比父类的异常范围更大。父类的私有方法不能被重写,如果子类非要......
  • 使用hook封装表格常用功能(react)
    实现内容配置分页:usePagination生成过滤项:useFilter获取表格选择配置:useSelect生成批量删除按钮:useDelete生成模态框:useModal示例render部分:<React.Fragment><Formlayout="inline">{DeleteEle}{FilterEles}</Form><Table{...{......