【python开发】面向对象高级和应用

这里写目录标题

  • 一、继承
    • (一)mro和c3算法
    • (二)py2和py3区别(了解即可)
  • 二、内置函数补充
    • (一)callable:是否可以在后面加括号执行
    • (二)super():按照mro继承关系向上找成员
    • (三)type():获取一个对象的类型
    • (四)isinstance():判断对象是否是某个类或其子类的实例
    • (五)issubclass():判断是否是某个类的子孙类
  • 三、异常处理
  • 四、反射

一、继承

继承存在的意义:将公共的方法提取到父类中,有利于增强代码的重用性。调用类中成员时应遵循:优先在自己所在的类中找,没有的话就去父类中找;吐过存在多个父类时,则先找左边的再找右边的。

(一)mro和c3算法

1、mro请添加图片描述

如果类中存在继承关系,则可以通过mro()获取当前类的继承关系(找成员的顺序)。

class C():
    pass

class B():
    pass

class A(B, C):
    pass

print(A.mro())#[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]
print(A.__mro__) #(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)

2、c3算法
请添加图片描述
对于上述这个继承关系来说,C3算法的计算规则是:
mro(A) = [A] + merge(mro(B), mro©, [B, C] )
接着要把B和C的继承关系填写出来
mro(A) = [A] +merge([B,object], [C,object], [B, C] )
C3算法是:先把先读取第一个B,然后查阅B和后面两个参数(C,object),[B, C] 里面除了第一个参数以外的其他参数(object和C)的关系,结果发现(object和C)中都不含B,所以就把B单独提取出来,并把其他参数中包含的B剔除。
mro(A) = [A] + [B] + merge(mro(object), mro(C,object), [C] )
接着按照算法的规则进行判别:
mro(A) = [A] + [B, C] + merge(mro(object), mro(object) )
mro(A) = [A] + [B, C, object]
mro(A) = [A, B, C, object]
mro(A) = [A, B, C]
请添加图片描述
mro(A) = [A] +mro(mro(B) +mro[C], [B, C])
mro(A) = [A] +mro([B], [C, D] , [B, C])
mro(A) = [A] +[B] + mro( [C, D] , [C])
mro(A) = [A] +[B, C]+ mro( [D] )
mro(A) = [A] +[B, C, D]
mro(A) = [A, B, C, D]
请添加图片描述

mro(A) = [A] +mro(mro(B) +mro[C], [B, C])
mro(A) = [A] +mro([B, D] , [C], [B, C])
mro(A) = [A] , [B], mro([D] , [C], [C])
mro(A) = [A] , [B, D], mro([C], [C])
**mro(A) = [A] , [B, D, C] **
**mro(A) = [A, B, D, C] **

请添加图片描述
mro(A) = [A] +mro(mro(B) +mro[C], [B, C])
mro(A) = [A], mro([B, D], [C, D], [B, C])
mro(A) = [A], [B], mro([D], [C, D], [C])
此时,我们就需要找D了,寻找其他参数中除了第一个参数以外的参数是否包含D,由于存在【C, D】,所以D不能提取出来,接着只能对比C,发现其他参数中不含有C,所以把C提出来
mro(A) = [A], [B, C], mro([D], [D])
**mro(A) = [A], [B, C, D] **
**mro(A) = [ A, B, C, D] **

请添加图片描述

mro(A) = [A], mro(mro(B), mro[C], mro[P], [B, C, P])
mro(B) = [B], mro(mro[D], mro[E], [D, E])
mro(D) = [D], mro(mro[G], mro[H], [G, H])

mro(D) = [D], mro([G], [H, K], [G, H])
mro(D) = [D], [G], mro([H,k], [H])
mro(D) = [D], [G, H], mro([k] ])
mro(D) = [D], [G, H, K ]
mro(D) = [D, G, H, K ]

mro(E) = E + mro(M)
mro(E) = [E, M]

mro(B) = [B], mro([D, G, H, K ], [E, M], [D, E])
mro(B) = [B], [D], mro([G, H, K ], [E, M], [E])
mro(B) = [B], [D, G], mro([H, K ], [E, M], [E])
mro(B) = [B], [D, G, H], mro([K], [E, M], [E])
mro(B) = [B], [D, G, H, K], mro([E, M], [E])
mro(B) = [B, D, G, H, K, E, M]

mro© =[C], mro(mro(E), mro(F), [E,F])
mro© =[C], mro([E, M], mro([F], mro[mor[M], mro[H], [M, H]), [E,F])
mro© =[C], mro([E, M], [F, M, N], [E,F])
mro© =[C], [E], mro([M], [F, M, N], [F])
mro© =[C], [E, F], mro([M], [M, N])
mro© =[C, E, F, M, N]

mro(A) = [A], mro([B, D, G, H, K, E, M], [C, E, F, M, N], [B, C, P])
mro(A) = [A], [B], mro([D, G, H, K, E, M], [C, E, F, M, N], [C, P])
mro(A) = [A], [B, D, G, H, K, C, E, F, M, N, H, P]
mro(A) = [A, B, D, G, H, K, C, E, F, M, N, P, object]

特别补充,继承父类关系:从左到右、深度优先,大小钻石,留住顶端

(二)py2和py3区别(了解即可)

在py2.2之前,只支持经典类(从左到右,深度优先,大小钻石,不留顶端),后来python希望所有类都默认继承object类,此时发现会有Bug,所以就再次创建了一个新式类支持这个功能:从左到右,深度优先,大小钻石,保留顶端。

在py2.2及之前,就有了经典类(不继承object)和新式类(直接或间接继承object)两种。

#经典类
class Foo():
    pass

#新式类
class base(object):
    pass

class Foo(base):
    pass

最终在py3中丢弃了经典类,只保留了新式类。

二、内置函数补充

类方法:classmethod、 静态方法:statisticmethod、属性:property

(一)callable:是否可以在后面加括号执行

一般来说,可以加括号执行的有:函数、类和带有__call__方法的实例对象

#1、函数
def func():
    pass

print(callable(func)) #True

#2、类
class Foo():
    pass

print(callable(Foo)) #True


#3、类中具有__call__方法的对象
class Foo(object):

    def __call__(self, *args, **kwargs):
        pass

v1 = Foo()
print(callable(v1)) #True

(二)super():按照mro继承关系向上找成员

class Base(object):

    def message(self, num):
        print("Base.message", num)


class Foo(Base):

    def message(self, num):
        print("Foo.message", num)
        super().message(num+100)


obj = Foo()
print(obj.message(1))
'''
Foo.message 1
Base.message 101
'''

根据上下述代码可以看出来,Foo类的父类是Base和Bar,先找到Base的父类中的message方法,执行该方法,由于有super方法,所以会向上找Base父类的message方法,但是由于这里的self是Foo()方法的实例对象,因此会向Foo()父类中找,Base方法没有,Bar方法中有message,于是继续调用Bar中的message方法。

class Base(object):

    def message(self, num):
        print("Base.message", num)
        super().message(1000)

class Bar(object):

    def message(self, num):
        print("Bar.message", num)


class Foo(Base, Bar):
    pass


obj = Foo()
print(obj.message(1))
'''
Base.message 1
Bar.message 1000
'''

应用场景:假设有一个类,他原本已经实现了某些功能,但我们想在原有代码基础上实现某些功能,此时就不必再次重写代码,只需要使用super()方法调用上游方法。

比如,我们可以改写字典中的get()函数功能:

info = dict()
info['name'] = "高宇星"
info['age'] = 18

print(info)
#{'name': '高宇星', 'age': 18}

value = info.get('age')
print(value) #18

#此时我们想在原有字典功能的基础上改写get功能
class Mydict(dict):

    def get(self, k):
        print("自定义功能")
        return super().get(k)

info = Mydict()
info['name'] = "高宇星"
info['age'] = 18
print(info)

value = info.get('age')
print(value) 
'''
自定义功能
18
'''

在实际开发的过程中,可以通过super()函数来寻找上游的方法。
请添加图片描述

(三)type():获取一个对象的类型

v1 = "高宇星今年18岁"
result = type(v1)
print(result)
#<class 'str'> 这里的str其实是类名称

#定义一个类
class Foo():
    pass
#实例化一个对象
v3 = Foo()
#查询该对象的类型
print(type(v3))
#<class '__main__.Foo'>

(四)isinstance():判断对象是否是某个类或其子类的实例

class Top(object):
    pass

class Base(Top):
    pass

class Foo(Base):
    pass

v_ = Foo()
print(isinstance(v_, Foo)) #True
print(isinstance(v_, Base))#True
print(isinstance(v_, Top)) #True

应用场景:简化代码

class Animal(object):
    def run(self):
        print("123456")


class Dog(Animal):
    pass


class Cat(Animal):
    pass

data_list = ['alex', Dog(), Cat(), 'root']

#在不使用isinstance方法时:
for item in data_list:
    if type(item) == Cat:
        item.run()
    elif type(item) == Dog:
        item.run()
    else:
        pass

#在使用isinstance函数时:
for item in data_list:
    if isinstance(item, Animal):
        item.run()
    else:
        pass

(五)issubclass():判断是否是某个类的子孙类

class Top(object):
    pass

class Base(Top):
    pass

class Foo(Base):
    pass


print(issubclass(Foo, Top)) #True
print(issubclass(Foo, Base))#True

三、异常处理

当我们在执行代码时,可能会出现一些不可知的错误,当我们不想让它报错,继续执行下面的代码时,可以选择用异常处理来做。

while True:
    url = input("请输入要下载的网页地址")

    try:
        res = requests.get(url=url)
    except Exception as e:
        print("请求失败的原因是:{}".format(str(e)))

    with open('content.txt', mode='wb') as f:
        f.write(res.content)

当运行无误时:

请输入要下载的网页地址http://www.baidu.com
请输入要下载的网页地址

当关掉网络再次运行时:

请求失败的原因是:HTTPConnectionPool(host='www.baidu.com', port=80): Max retries exceeded with url: / (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x00000282B35E4520>: Failed to resolve 'www.baidu.com' ([Errno 11001] getaddrinfo failed)"))
请输入要下载的网页地址

四、反射

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/410876.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

雷达一维成像:基于数据集的实践

雷达一维成像&#xff1a;基于数据集的实践 (距离压缩\距离-时间图\距离-多普勒图\微多普勒图) 说明 雷达成像技术是雷达发展的一个重要里程碑&#xff1a;从此雷达的功能不仅仅是将所观测的对象视为点目标&#xff0c;并只测量它的位置与运动参数。雷达成像技术使得我们可以获…

EMQX Enterprise 5.5 发布:新增 Elasticsearch 数据集成

EMQX Enterprise 5.5.0 版本已正式发布&#xff01; 在这个版本中&#xff0c;我们引入了一系列新的功能和改进&#xff0c;包括对 Elasticsearch 的集成、Apache IoTDB 和 OpenTSDB 数据集成优化、授权缓存支持排除主题等功能。此外&#xff0c;新版本还进行了多项改进以及 B…

Linux第63步_为新创建的虚拟机添加必要的目录和安装支持linux系统移植的软件

1、创建必要的目录 输入密码“123456”&#xff0c;登录虚拟机 这个“zgq”&#xff0c;是用户名&#xff0c;也是下面用到的的“zgq”目录。 1)、创建“/home/zgq/linux/”目录 打开终端&#xff0c;进入“/home/zgq/”目录 输入“mkdir linux回车”&#xff0c;创建“/ho…

电子版证件照怎么弄?分享完整制作方法!

在数字化时代&#xff0c;电子版证件照已成为我们生活中不可或缺的一部分。无论是求职、办理证件还是网络注册&#xff0c;都需要用到电子版证件照。那么&#xff0c;如何制作一份合格的电子版证件照呢&#xff1f;本文将为您详细介绍电子版证件照的制作方法&#xff0c;并推荐…

开年大吉!安全狗入选工信部工业互联网试点示范名单

近日&#xff0c;工业和信息化部信息通信管理局公布了2023年工业互联网试点示范名单。此次名单根据《工业和信息化部办公厅关于组织开展2023年工业互联网试点示范项目申报工作的通知》&#xff08;工信厅信管函﹝2023﹞319号&#xff09;&#xff0c;经企业申报、地方推荐、专家…

通过OCR实现纯数字识别

基于飞浆paddle训练框架 照这个改的 https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/cv/image_ocr.html 训练不到10分钟 10epoch cpu&#xff1a;inter i5 8250 U 脚本生成的图10000 验证训练&#xff1a;3:7 预测结果 chatgpt写的代码&#xff0c;生成数…

从ChatGPT到Sora,来了解大模型训练中的存储

1 从chatGPT到Sora 2022年底&#xff0c;OpenAI推出人工智能聊天机器人ChatGPT&#xff0c;开启了大模型领域的“竞速跑”模式。2024年2月15日&#xff0c;随着视频生成模型Sora的横空出世&#xff0c;OpenAI再度掀起热潮。 Sora将视频生成内容拉到了一个全新的高度&#xff0c…

Pybind11 在C++中运行python脚本操作内存数据

pybind11资料 官方Github:Pybind11 Github Pybind11文档&#xff1a;Pybind11 文档 文档在深入使用后需要细细读懂&#xff0c;包括全局只能有一个解释器&#xff0c;如何从C中返回指针/引用等。基本文档中需要注意的点都会遇到 Python环境安装及维护 对于正常使用人员&…

python自动化测试三部曲之request+django实现接口测试

这里废话少说&#xff0c;进入正题 我的思路是这样的 1、先用django实现登陆、增加、删除、查看4个接口 2、在excel定义好测试案例、然后读取excel中的案例&#xff0c;然后把案例用unittest框架组装和封装 3、启动django&#xff0c;执行测试案例 一、先跑通unittest到dj…

Scikit-Learn逻辑回归

Scikit-Learn逻辑回归 1、逻辑回归概述1.1、逻辑回归1.2、逻辑回归的优缺点1.3、逻辑回归与线性回归 2、逻辑回归的原理2.1、逻辑回归的概念与原理2.2、逻辑回归的损失函数 3、 1、逻辑回归概述 1.1、逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;主要解决二…

【IDEA】java 项目启动偶现Kotlin 版本问题 error:Kotlin:module was

一、问题描述&#xff1a; error:Kotlin:module was compiled with an incompatible version of kotlin the binary version of its metadata is二、问题原因&#xff1a; jar包版本冲突 三、解决方式&#xff1a; 1、Rebuild Project&#xff08;推荐☆&#xff09; 重新构…

【web】云导航项目部署及环境搭建(复杂)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍1.1项目环境架构LNMP1.2项目代码说明 二、项目环境搭建2.1 Nginx安装2.2 php安装2.3 nginx配置和php配置2.3.1 修改nginx文件2.3.2 修改vim /etc/p…

内存溢出排查

1、进入k8s容器对应服务节点查看进程号 ps aux|grep javaps aux 是用BSD的格式来显示 java这个进程 显示的项目有&#xff1a;USER , PID , %CPU , %MEM , VSZ , RSS , TTY , STAT , START , TIME , COMMAND USER: 行程拥有者 PID: pid %CPU: 占用的 CPU 使用率 %MEM: 占用的记…

python Airtest自动化测试工具的的使用

Airtest全称AirtestProject&#xff0c;是由网易游戏推出的一款自动化测试框架&#xff0c;在软件测试的时候使用到了该框架。这里记录一下安装、使用和遇到的坑的问题… Airtest的官网介绍项目构成 Airtest&#xff1a;是一个跨平台的、基于图像识别的UI自动化测试框架&#x…

YOLOv9尝鲜测试五分钟极简配置

pip安装python包&#xff1a; pip install yolov9pip在https://github.com/WongKinYiu/yolov9/tree/main中下载好权重文件yolov9-c.pt。 运行下面代码&#xff1a; import yolov9model yolov9.load("yolov9-c.pt", device"cpu") # load pretrained or c…

观察者模式与发布订阅模式

观察者模式 定义&#xff1a; 观察者模式是一种行为型设计模式&#xff0c;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 结构图&#xff1a; ES6简易代码实现&#xff1a; //ts环境下…

Uncertainty-Aware Mean Teacher(UA-MT)

Uncertainty-Aware Mean Teacher 0 FQA:1 UA-MT1.1 Introduction:1.2 semi-supervised segmentation1.3 Uncertainty-Aware Mean Teacher Framework 参考&#xff1a; 0 FQA: Q1: 不确定感知是什么意思&#xff1f;不确定信息是啥&#xff1f;Q2&#xff1a;这篇文章的精妙的点…

300分钟吃透分布式缓存-14讲:大数据时代,MC如何应对新的常见问题?

大数据时代 Memcached 经典问题 随着互联网的快速发展和普及&#xff0c;人类进入了大数据时代。在大数据时代&#xff0c;移动设备全面融入了人们的工作和生活&#xff0c;各种数据以前所未有的 速度被生产、挖掘和消费。移动互联网系统也不断演进和发展&#xff0c;存储、计…

掌握“这招”,平趴也能轻松捕获威胁情报!——利用流行度排名升级威胁情报收集

引言 威胁情报是提供强大网络安全服务的重要基石&#xff0c;这些服务可以保护各地的移动设备和互联网用户。但当今的互联网威胁是复杂且具有强适应性的&#xff0c;它们通过不断改变其面貌以逃避安全防御。这使得提供涵盖各种威胁形势的威胁情报变得日益困难&#xff0c;组织…

工具篇-- 定时任务xxl-job

文章目录 前言一、xxl-job 运行&#xff1a;1.1 下载并且启动&#xff1a;1.2 项目介绍&#xff1a;1.2.1 xxl-job-admin&#xff1a;1.2.1.1 xxl-job-admin 作用&#xff1a;1.2.1.2 xxl-job-admin 的配置&#xff1a; 1.2.2 xxl-job-executor-samples&#xff1a;1.2.2.1 pom…
最新文章