首页 > 其他分享 >类的特性之封装、多态

类的特性之封装、多态

时间:2022-11-07 21:13:04浏览次数:53  
标签:调用 封装 定义 继承 多态 特性 查找 名称 方法

昨日内容回顾

  • 动态方法与静态方法

    动态方法即调用时自动将调用者作为参数传给功能的方法。类内方法默认为动态方法且将对象作为参数传入。

    静态方法即与正常的功能相同,需要自行传入所有参数。使用staticmethod装饰器可定义。

    若要将类作为参数自动传入方法作为参数,需要使用classmethod装饰器定义。

  • 类的继承及其本质

    在定义类时,若要使用其他类的名称或方法,需要使用类的继承,定义类时加括号写上要继承的类名。

    父类与子类的关系类似于类与对象,父类具有所有子类共有的名称或功能,以节省代码。

  • 名称的查找顺序

    python中名称的查找遵循相同的原则,从调用名称的位置找起,若同级名称空间中没有要调用的名称,则向上级空间查找。在类中其表现形式为,从对象开始向其所在类,再向类所在父类查找,以此类推。

    类的多继承情况下,情况分为两种,若所继承的类最终没有收束到同一父类,则按照继承的先后顺序从左到右查找,若支线上有继承情况,则优先完成支线的查找,所谓深度优先;若继承的类最终收束到同一父类,则最终的父类最后被查找,其他顺序与不收束情况下一致,所谓广度优先。

    名称查找的主要目的是使用,因此,在查找时要找尽可能简单的路径进行调用,以节省计算机资源的消耗,这可能是以上查找顺序形成的根据。在多继承的情况下,存在继承关系的类在调用时消耗的资源更少,因此会出现深度优先的情形,广度优先则是因为在调用时遵循的路径其实只有一条,在这种情况下,要选择尽量短的路径以节约资源,在更近的路径上有满足要求的目标,就没有必要去更远的路径调用。

  • 经典类与新式类

    经典类即在定义时没有继承任何类的类,这样的类在使用时比较麻烦,因为还需要重新定义类所具有的名称及方法,实用价值不高。

    python3中默认创建的类为新式类,即在定义时默认继承object类或其子类,这样我们在使用时就可以调用类所具有的基本功能。

    在定义类时,顺手使其继承object类,可以保证类在不同python环境中的兼容性。

今日内容概要

  • 类的派生的应用
  • 类的特性之封装
  • 类的特性之多态
  • 反射

今日内容详细

类的派生的应用

通过类的派生可以扩充类的功能,实现更加个性化的操作。

使用json模块序列化时,部分数据类型不支持序列化,进行转换时会报错。

通过查看源码,定位报错部位,通过替换函数中使用的JSONEncoder类,为报错的情况添加新的处理措施,最后使用super调用原类中的方法。

类的特性之封装

一般情况下,通过对象名加点的形式可以调用类中的名称,若不想调用者通过直接使用点的形式调该名称,则在定义的时候,使用双下划线加名称的形式可以对其进行隐藏。单下划线也有隐藏之意。

隐藏后的名称表面上不能通过点的形式调用,实际只是被改变了名称,在原名称之前加上了下划线及类名。

被隐藏的名称虽然不能被点调用,但是可以在定义阶段作为变量名调用。通过定义相应的接口完成相应的操作。

通过调用property装饰器可以对对象内方法进行装饰,被装饰的方法的参数只能有对象自身,这样就可以通过直接点的形式获取其对应的结果。

类的特性之多态

同一个类的同一种方法在不同的对象中的表现形式可能不同,这就是类的多态性。

具有相同特征的对象即可归为同一类,即所谓的鸭子类型。

反射

反射为我们提供了通过字符串操作数据的方法。常用的方法有:

hasattr() 判断该对象中是否有指定的名称

getattr() 通过给出的字符串调用对应的名称或方法

setattr() 为对象中指定名称的变量赋值

delattr() 删除对象中指定的名称

标签:调用,封装,定义,继承,多态,特性,查找,名称,方法
From: https://www.cnblogs.com/akazukis/p/16867468.html

相关文章

  • 面向对象(二)——派生方法、封装、多态、反射
    一、派生方法:子类基于父类某个方法做了扩展classPerson:def__init__(self,name,age,gender):self.name=nameself.age=agesel......
  • 面向对象之封装、多态 反射
    目录派生方法实战演练面向对象三大特征之封装封装之隐藏封装之伪装面向对象三大特征之多态面向对象之反射反射实战案例派生方法实战演练importjsonimportdatetimed1......
  • 面向对象之三大特性
    今日内容概要派生方法实战演练面向对象三大特性之封装面向对象三大特性之多态面向对象之反射反射的实战案例今日内容详细派生方法实战演练importjsonimpor......
  • 类和对象-封装
    4.1封装4.1.1封装的意义封装是C++面向对象三大特性之一封装的意义:将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制封装意义一:​ 在设计类......
  • 进入python的世界_day28_python基础—— 面向对象三大特性之封装、多态、反射
    一、要学会看源码了(略微)1.举例​ 比如说以前学的json,虽然知道是可以把字典转为json格式的数据,但是当时的字典K、V都是可以被转的类型,如果V不是json支持转的格式,转换时......
  • 面向对象之封装,多态,反射
    面向对象之封装,多态,反射派生实际应用importdatetimeimportjsonclassMyJsonEncoder(json.JSONEncoder):defdefault(self,o):#形参o就是......
  • 面向对象之封装和多态
    派生方法实战演练面向对象三大特性之封装面向对象三大特性之多态面向对象之反射反射的实战案例派生方法实战演练importjsonimportdatetimed={'t1':datetim......
  • 派生方法实例、面向对象三大特性之封装、多态和反射
    目录一.派生方法实战演练二.面向对象三大特性之封装封装伪装三.三大特性之多态四.面向对象之反射利用字符串操作对象的数据和方法反射实战案例一.派生方法实战演练import......
  • 面向对象:派生,三大特性封装,多态,反射
    派生实操importjsonimportdatetimed={'t1':datetime.date.today(),'t2':datetime.datetime.today(),'t3':'jason'}res=json.dumps(d)prin......
  • 面向对象之多态/反射
    派生方法的更多应用importjsonimportdatetimea={'t1':datetime.date.today(),'t2':datetime.datetime.today(),'t3':'moon'}res=json.dumps(a)......