面向对象的编程思想和Python的继承和多态,特殊方法,引用计数

2023-11-10

面向对象的编程思想和Python的类,访问和属性,继承 在上一文中我们了解到了,私有的属性的访问方式:实例名._类名__私有属性名。

一、私有的属性如何对外提供公有的取值和赋值方法呢?提供公有的方法作为接口进行取值

例如:

class Avg_Score:# 平均成绩类
    def __init__(self,num1,num2,num3):
        self.set_num(num1,num2,num3)
    def num_avg(self): #计算机求平均数的方法
        return (self.__num3+self.__num2+self.__num1)/3 #返回平均成绩
    def get_num(self):
        return self.num1,self.num2,self.num3
    def set_num(self, num1,num2,num3):#赋值方法
        if 0 <= num1 <= 120:
            self.__num1 = num1
        if 0 <= num2 <= 120:
            self.__num2 = num2
        if 0 <= num3 <= 120:
            self.__num3 = num3
        else:
            raise ValueError('您输入的成绩不在范围内,请重新输入')
avg=Avg_Score(9,6,7)#创建类的实例
print('三科成绩之和为:',avg.num_avg())#类的实例,调用属性,得到属性值
print('语文成绩为:',avg._Avg_Score__num1)#进行私有属性的取值

二、多继承的执行顺序

Python支持多继承。例如一个子类,可以继承多个父类。就像人类,你可以同时继承父亲和母亲的基因。一个子类同时继承两个父类,其中的方法相同时的解析顺序

class F_Person:
    def age(self):
        print('这个是父亲的年龄')
class M_Person:
    def age(self):
        print('这个是母亲的年龄')
class Children(M_Person,F_Person):
    pass
real=Children()
real.age()
print('子类的执行顺序为:',Children.__mro__)#查看方法的解析顺序

在这里插入图片描述
由上图可见,先继承那个,程序会先解析那个父类

三、Python中的布尔类型可以和数字进行运算

在这里插入图片描述

由上图中,通过mro()方法可以看出:bool类继承int类,int类继承了object类

四、super()方法,可以调用父类的方法

class Avg_Score():# 平均成绩类
    def __init__(self,num1,num2,num3):
        self.num1=num1 #英语成绩
        self.num2=num2 #语文成绩
        self.num3=num3 #数学成绩
    def num_avg(self): #计算机求平均数的方法
        print((self.num3+self.num2+self.num1)/3) #返回平均成绩
class   Rewrite_Avg_Score(Avg_Score):#继承父类
    def __init__(self,num1,num2,num3,num4):
        super().__init__(num1,num2,num3)
        self.num4=num4
    def num_avg(self):#重写父类的方法
        super().num_avg()#调用父类的方法
        print(self.num4)
avg=Rewrite_Avg_Score(60,50,90,69)
avg.num_avg()

结果如图:

在这里插入图片描述
五、多态就是“具有多种形态”它指的是“即便不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态地决定调用哪个对象中的方法。

class Fruit():#水果类
    def flavor(self):
        print("水果很美味")
class Banana(Fruit):#香蕉类
    def flavor(self):#重写flavor
        print("香蕉很甜")
class Apple(Fruit):#苹果类
    def flavor(self):#重写flavor
        print("苹果脆甜")
class Noodles:#面条类
    def flavor(self):
        print("面条有营养")
def fun(q):
    q.flavor()
fun(Fruit())#水果类
fun(Banana())#香蕉类
fun(Apple())#苹果类
fun(Noodles())#面条类

动态语言不关心对象的类型,只关心对象的行为,类型可以根据值来改变。
在这里插入图片描述

六、自定义类对象实列特殊方法

(一)用__add__()方法,可以实现两个自定义类对象的实例对象之间的相加操作

class Add:
    def __add__(self,other):#用add方法实现两个类对象的相加
        return self.name+other.name
    def __init__(self,name):
        self.name=name
#创建了两个自定义类的对象
a1=Add(1)
a2=Add(3)
print(a1+a2) #当使用+时,会自动调用类对象中的特殊方法__add__()

在这里插入图片描述
在这里插入图片描述
(二)用__len__()方法,可以实现计算自定义对象的长度


class Add:
    def __add__(self,other):#用add方法实现两个类对象的相加
        return self.name+'和'+other.name
    def __init__(self,name):
        self.name=name
    def __len__(self):#用len方法计算类对象的长度
        return len(self.name)
#创建了两个自定义类的对象
a1=Add('张三')
a2=Add('李四')
print(len(a1+a2))#当重写了系统中的方法后,就可以进行计算类对象的长度。否则注释掉后不能够实现计算类对象的长度

面向对象的编程思想和Python的继承和多态,特殊方法,引用计数
七、对象的引用计数,如何知道对象有没有被使用,通过跟踪计数的方式进行确定。

(一)对象引用加1的情况

class Add:
    pass
a=Add()  #第一种情况:对象赋值给变量,引用加1
c=a #第二种情况:引用对象的变量赋值给另一个变量,加1
list=[6,8,a] #第三种情况:对象作列表中的元素,加1
import sys
#使用sys.getrefcount()函数查看引用次数,使用该方法查看时会被引用一次
print(sys.getrefcount(a))#第四中情况:对象作为函数调用时的实参。调用该方法时,输出的结果为4,说明第一个创建MyClass()的实例对象有4个引用

print(sys.getrefcount(Add())) #输出结果为1 ,对象作为方法的参数传入引用计数加1,执行完毕,引用计数减1

在这里插入图片描述
(二)对象引用减1的情况。

import sys
class Add:
    pass

print(sys.getrefcount(Add()))#情况一,对象离开它的作用域,例如:对象所在的函数执行完毕
a=Add()  #对象赋值给变量,引用加1
c=a #引用对象的变量赋值给另一个变量,加1
print(sys.getrefcount(a))#对象的引用为3
del c #情况二:对象的引用被显示销毁,c=a被销毁,所以减1
print(sys.getrefcount(a))#对象的引用为2,说明减1
list=[6,8,a] #对象作列表中的元素,加1
print(sys.getrefcount(a))#对象的引用为3
list=[6,8]#情况三:从容器中删除对象,或对象所在的容器被销毁
print(sys.getrefcount(a))#对象的引用为2,说明减1

在这里插入图片描述
当对象的应用机制减到零的时候,就等待垃圾回收机制进行回收。

以上分析了属性的取值和赋值方法;并通过实例分析了多继承的执行顺序;多态;特殊方法:add()和__len__()方法的重写实现类对象的相加和计算长度;对象的引用计数:加减情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象的编程思想和Python的继承和多态,特殊方法,引用计数 的相关文章

随机推荐

  • 计算机网络第2章(物理层)

    B站视频 计算机网络微课堂 有字幕无背景音乐版 网址 https www bilibili com video BV1c4411d7jb p 61 目录 2 1 物理层的基本概念 2 2 物理层下面的传输媒体 导引型传输媒体 非导引型传输媒
  • Vue弹窗传值

    场景 点击新增后 需要将这个页面的分类Id传到弹窗页面 新增的时候绑定这个分类 步骤 1 列表页面中弹窗标签中绑定 classifyId this classify
  • 演唱会为什么总是抢不到票?用Python做一个自动抢票脚本!想看谁的就看谁的!

    大麦网 是中国综合类现场娱乐票务营销平台 业务覆盖演唱会 话剧 音乐剧 体育赛事等领域 但是因为票数有限 还有黄牛们不能丢了饭碗 所以导致了 很多人都抢不到票 那么 今天带大家用Python来制作一个自动抢票的脚本小程序 文章末尾看运行效果
  • Java 基于文本界面的《员工管理系统》

    一 代码实现 1 设计分析 该管理系统使用了5个包 Package 类似于文件夹 1 bean 包含员工类 Employee 2 main 主程序的入口 3 service 主要是 业务逻辑层 的功能实现 4 util 存放工具类 此处存放
  • 【springmvc系】利用RequestBodyAdviceAdapter做接口鉴权

    需求 有个简单的需求 对于第三方接口我们需要做个简单的鉴权机制 这边使用的是非对称性加密的机制 我们提供三方公钥 他们通过公钥对接口json报文使用加密后的报文请求 我们通过对接收过来的请求某一个加密报文字段来进行RSA解密校验 考虑到日后
  • hashmap原理_HashMap原理jdk7和jdk8的区别

    一 hashMap的jdk1 7和jdk1 8区别 1 实现方式 jdk7中使用数组 链表来实现 jdk8使用的数组 链表 红黑树 2 新节点插入到链表是的插入顺序不同 jdk7插入在头部 jdk8插入在尾部jdk7中 如何在头部插入 看a
  • [Hadoop3.3.1]:Unable to load native hadoop library for your platform

    需求 linux已经启动了hadoop集群 想要在windows中用java对文件进行下载操作 错误提示 找不到winutils exe hadoop dll没有设置原因 Hadoop访问windows本地文件系统 要求Windows上的本
  • SQL Server数据库进阶

    批处理 将多条SQL语句作为一个整体去编译 生成一个执行计划 然后执行 为了将一个脚本分为多个批处理 可使用GO语句 GO语句的特点 GO语句必须自成一行 只有注释可以在同一行上 它使得自脚本的开始部分或者最近一个GO语句以后的所有语句编译
  • elementUI中,实现一个单元格内显示两行数据,并用其中一个数据进行排序。

    最近在公司中 有这样一个需求 表格中 一个单元格里面显示两行数据 并且可以使用其中一行进行排序 其中数据的样式也要实时变动 类似于下图 这样的话 elementUI中自带的prop就不适合了 所以 需要展示两行数据的地方 我们就用插槽来解决
  • 重叠社区发现-UEOC算法(unfold and extract overlapping communities)学习笔记

    本文提出了一种基于马尔可夫动力学模型的发现节点共享社区的算法UEOC 在UEOC方法中 为了检测出所有的自然群落 将马尔可夫随机游动方法与一种新的约束策略相结合 该策略基于相应的退火网络 21 用于展开每个群落 然后 利用一个借助电导的截止
  • 【Python编程入门】环境搭建

    作为一门跨平台的高级编程语言 Python可以运行在几乎所有主流的操作系统中 这也意味着 只要我们在本机电脑安装配置完Python环境后 便可以轻松愉快的学习Python语言了 这是一门值得大部分人学习的计算机编程语言知识 关于Python
  • angular自定义form表单元素-checkList

    实际使用form的时候 最外层的form的某个表单元素可能是个组合的 这种情况如果是可多场景复用的 最好封装一个表单元素 本文以组合复选框为例来说明下自定义表单元素的过程 实现效果 展示效果 html
  • TeamViewer三种许可证的区别是什么?

    很多想要购买TeamViewer正版许可证的用户 不清楚这三种许可证的区别 所以今天小编就为大家介绍一下 这三种许可证到底有何区别以及购买那种最划算 首先为大家介绍一下TeamViewer Business商业版许可证 如下图所示 图1 B
  • 汇编语言基础知识

    文章目录 80386常用寄存器 一 常用寄存器 1 1 通用寄存器 1 2 段寄存器 1 3 程序状态与控制寄存器 二 常用基本指令 2 1 数据传送指令 2 2 算术运算指令 2 2 1 加法指令 2 2 2 减法指令 2 2 3 乘法指
  • 查看使用systemctl启动日志

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 查看启动日志 journalctl f或者 journalctl xe 2 设置开机自启动 systemctl enable nginx service 3 启动ngi
  • 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java制造类企业erp23725

    面对老师五花八门的设计要求 首先自己要明确好自己的题目方向 并且与老师多多沟通 用什么编程语言 使用到什么数据库 确定好了 在开始着手毕业设计 1 选择课题的第一选择就是尽量选择指导老师擅长的课题 其实说白一点 你们的指导老师每年都是那几个
  • C3P0连接池参数配置

  • Linux系统wget unable to resolve host address解决办法

    Linux系统运行yum安装rpm包的时候提示wget unable to resolve host addresswget 无法解析主机地址 这就能看出是DNS解析的问题 错误提示 wget unable to resolve host
  • 用于CTF(MISC)的kali虚拟机更改过程记录

    Kali更改记录 安装pip2 太多工具需要python2了 安装setuptools 18 5 wget https pypi python org packages source s setuptools setuptools 18 5
  • 面向对象的编程思想和Python的继承和多态,特殊方法,引用计数

    面向对象的编程思想和Python的类 访问和属性 继承 在上一文中我们了解到了 私有的属性的访问方式 实例名 类名 私有属性名 一 私有的属性如何对外提供公有的取值和赋值方法呢 提供公有的方法作为接口进行取值 例如 class Avg Sc