面向对象高级——魔术方法、反射、异常

day19-面向对象高级和应用 文章摘要: 本文深入探讨Python面向对象编程的高级特性,重点解析继承、异常处理与反射机制。内容包括:继承补充(mro和c3算法解析)、内置函数补充、异常处理机制及反射应用。通过多继承示例和mro()方法详细展示类成员查找顺序,并对比Python2与Python3在经典类和新式类上的区别。最后介绍异常处理的基本语法和自定义异常,以及反射机制的常见应用场景。掌握这些知识可提升代码重用性、健壮性和灵活性,是Python高级编程的重要技能。 关键词:Python、面向对象、继承、异常处理、反射 阅读详情

面向对象的内置方法

​ 面向对象中的内置方法又称魔术方法,简单来说就是以双下划线开头和结尾的方法。下面我们来介绍几个比较常用的内置方法:

  • __init__

    在对象实例化的时候自动调用该方法。

class Student():
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('我执行了')
        
stu = Student('mary',18)
  • __str__

    打印或者输出对象的时候,自动调用该方法。

class Student():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 打印或者输出对象的时候,自动调用的方法
    def __str__(self):
        return 'name:%s' % self.name
        # return 123  # 返回结果是字符串,不能是整型


stu = Student('mary', 19)
print(stu)  

# 结果输出:如果我们不写__str__方法,那么打印结果就是内存地址,现在我们写了,就会触发这个方法
name:mary
  • __del__

    第一种情况是通过del 删除对象的时候会自动触发;第二种情况是当整个程序执行完毕后会调用该方法。

class Student():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __del__(self):
        print('触发了')

stu = Student('mary', 18)
del stu
print(123)

# 结果输出:(第一种情况)
触发了
123
# 如果注释掉del stu ,再执行,则结果为:(第二种情况)
123
触发了
  • __enter__与__exit__

    使用with上下文管理的时候,只要出现with语句,就会触发__enter__方法,如果有返回值则赋值给as后面声明的变量;当with中的代码块执行完毕后,会自动触发__exit__方法。

class Open:
    def __init__(self,name):
        self.name=name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
        # return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我')



with Open('a.txt') as f:
    print('=====>执行代码块')

# 输出结果:
出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量
=====>执行代码块
with中代码块执行完毕时执行我
  • __getattr__、__setattr__与__delattr__

    只有在使用点调用属性并且属性不存在的时候才会触发__getattr__方法的执行;在添加/修改属性会触发__setattr__方法的执行;在删除属性的时候会触发__delattr__方法的执行。

class Foo:
    x=1
    def __init__(self,y):
        self.y=y

    def __getattr__(self, item):
        print('----> from getattr:你找的属性不存在')


    def __setattr__(self, key, value):
        print('----> from setattr')
        # self.key=value # 如果这样写,就会再次调用__setattr__方法,就会出现无限递归了
        self.__dict__[key]=value # 应该使用这种方式,不会出现递归的问题

    def __delattr__(self, item):
        print('----> from delattr')
        # del self.item  # 无限递归了
        self.__dict__.pop(item)

#__setattr__添加/修改属性会触发它的执行
f1=Foo(10)
print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
f1.z=3
print(f1.__dict__)

#__delattr__删除属性的时候会触发
f1.__dict__['a']=3 # 我们可以直接修改属性字典,来完成添加/修改属性的操作
del f1.a
print(f1.__dict__)

#__getattr__只有在使用点调用属性且属性不存在的时候才会触发
f1.xxxxxx
  • __call__

    在对象后面加括号,会触发__call__方法的执行。构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:

    def __init__(self):
        pass
    
    # 对象加括号
    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 __init__
obj()  # # 执行 __call__

反射

在python的面向对象中,反射的意思就是通过字符串的形式操作对象相关的属性。在python中,一切事物都是对象,因此都可以使用反射。其中主要有四个方法:

注意:一切皆对象,类本身也是一个对象。

  • getattr(object,name,default=None)通过字符串获取属性
class Student():
    school = 'SH'
    def func(self):
        print('from func')

stu = Student()

print(getattr(stu, 'school', 123))  # 如果有该属性,则获取属性值,如果没有,则设置为默认值
print(getattr(stu, 'func'))  # 方法func的内存地址
getattr(stu, 'func')()  # 加括号调用func方法
  • setattr(x,y,v):通过字符串添加、修改属性
class Student():
    school = 'SH'
    def func(self):
        print('from func')

stu = Student()

setattr(stu, 'x', 100)
print(stu.__dict__)
  • hasattr(object,name):判断object中是否含有name属性
class Student():
    school = 'SH'
    def func(self):
        print('from func')

stu = Student()

print(hasattr(stu, 'school'))
  • delattr(object,name):从object中删除name属性
class Student():
    school = 'SH'
    def func(self):
        print('from func')

stu = Student()
stu.x = 1
delattr(stu, 'x')
delattr(Student, 'school')
print(Student.__dict__)

异常

什么是异常

​ 在编程中,异常就是错误发生的信号,如果不对该信号做处理,程序就会终止运行。

为什么要用异常

​ 使用异常的目的是为了增加代码的健壮性。

如何使用异常
  • 语法结构
try:
    pass
except 异常的类型:
    pass
except 异常的类型:
    pass
except 异常的类型:
    pass
else:
	print('当没有发生异常的时候执行')
finally:
    print('不管有没有异常都会执行')

注意:try和else不能单独组合使用,其他组合可以搭配使用。

  • 主动抛出异常
class Animal():
    def speak(self):
        raise Exception('必须实现speak方法')


class Student(Animal):
    def speak(self):
        pass


stu = Student()
stu.speak()
  • 自定义异常
class MyException(BaseException):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

raise MyException('出问题啦')
16-面向对象高级 Python中除了内置的type元类以外,用户也是可以自定义元类的,只要继承type类即可。只有继承了type类才能称之为一个元类,否则就是一个普通的自定义类,自定义元类可以控制类的产生过程。例如,我们前面学习过的单例模式,也可以基于元类来实现,而且基于元类写法,可以很方便的给不同的类设置单例模式。pass当然,除了上面的单例模式的应用以外,开发中还可以基于元类的特点,保证代码规范问题。例如要求程序中设计的类,类名必须首字母大写,而且必须有类的文档说明和所有公有方法的文档说明,不能为空。 阅读详情

相关推荐

大厂Python自动化测试面试题合集

题目:函数的作用是什么?调用函数的语法?答案:将独立功能代码封装成模块,复用代码;函数名(实参)。题目:函数 return 作用是什么?无 return 时函数返回什么?多返回值底层是什么类型?答案:返回函数执行结果;无 return 默认返回 None;return x,y,z 底层自动封装为元组。题目:函数四大参数类型分别是什么?定义顺序要求?答案:必选参数、默认参数、可变位置 * args、命名关键字、可变关键字 **kwargs;顺序:必选→默认→*args→命名关键字→**kwargs。

悦分享 104

python----面向对象---内置方法

内置方法 1.dir :使用dir获取一个对象的属性和方法 print(dir('abc')) print(dir(husky)) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '...

huotong 316

python使用TensorRT报错,多线程或多进程中使用问题

python使用TensorRT报错,Cuda Runtime问题

qq_44224801的博客 747

设计模式(python)-单例模式

单例模式的理解 保证只有一个特定的类型对象,并提供全局访问点 目的: 确保类有且只有一个对象被创建 为对象提供一个访问点,以使程序可以全局访问该对象。 控制共享资源的并行访问。 应用范围: 日志记录,数据库操作,打印机后台处理程序等。 例如:希望使用一个日志类对象,将多个服务的日志信息存储到同一个日志文件中。 下面是单例模式的UML图: python实现经典的单例模式 class singl...

杯酒和雪的博客 690

MatterPort3D 数据集下载

【代码】MatterPort3D 数据集下载。

qq_44106838的博客 6783

工业相机与ABB机器人Socket通信实战:手把手教你用RobotStudio 6.08搭建视觉引导工作站

本文详细介绍了工业相机与ABB机器人通过Socket通信实现视觉引导工作站的实战教程。使用RobotStudio 6.08平台,涵盖工作站搭建、坐标系标定、RAPID代码开发及TCP/IP通信配置,特别解析了欧拉角与四元数转换等关键技术难点,助力智能制造产线升级。

weixin_42531516的博客 408

python第八天-类详解

目录 1、python中没有重载(重名) 2、方法的动态性 3、私有属性和私有方法(实现封装) 4、@property装饰器 5、面向对象的特征 6、继承 7、object根类 8、重写__str__属性 9、多重继承 10、多态 11、特殊属性 12、对象的浅拷贝和深拷贝 13、组合 1、python中没有重载(重名) python中,方法的参数没有类型,参数的数量也可以由可变参数空值,所有python中是没有重载的。 如果出现重名的方法,只有在最后的方法是有效的。 2、

从零瞎学日记 998

eLabRadio软件无线电虚实结合仿真开发平台简介

在使用仿真平台时,不要关闭设备或断开设备与PC机之间的网络连接,否则,仿真平台将无法正常工作。注:采用eNodeX设备认证方式,当出现“设备不存在”的报错时,请检查计算机IP是否和硬件设备IP处于同一网段,或者是否是先连接好网线,再开启硬件设备的。①此登录方式下,需要先建立软件与硬件的通信:在登录窗口点击【网络配置】,参照下图输入设备IP,服务器地址无需设置,设置完成后点击确认,此时登录界面无需设置账号密码;,拷贝到电脑上,使用管理员权限运行setup.exe,下一步直到安装完成,桌面会生成快捷方式。

weixin_55349105的博客 6319

<_main__.类名 object at 0x0000000002A7CEB8>

转载.https://blog.youkuaiyun.com/ArtinCode/article/details/103075979 成功解决打印输出类中内容出现<main_.类名 object at 0x0000000002A7CEB8> 注意使用__str__的返回值即可解决问题,具体看代码

weixin_44219130的博客 1万+

OpenWrt路由开启DDNS+端口转发进行外网访问

OpenWrt路由开启DDNS+端口转发进行外网访问(LuCI界面实现)--开篇一、准备工作二、开机!三、连接--结尾 –开篇 本篇适用于一切装有OpenWrt系统的路由器/软路由,只要你保证有WAN接口和一个光猫,甚至你不需要有LAN接口(当然前提是你能连接路由器的WIFI进后台,不然你只能通过LAN进后台咯)。所有的配置过程都是基于LuCI界面来的,当然大神们一般都通过SSH登陆路由使用命令配置,但我也不会啊,只能给个有GUI界面的教程了。 一、准备工作 一个装有OpenWrt系统的路由器/软路由并

秋之颂的博客 9万+

F5高可用HA配置详情

F5 HA详细配置

weixin_45843944的博客 3025

[Python-5]Python面向对象

面向过程和面向对象思想、类、属性、方法、__init__构造方法和__new__方法、实例属性和实例方法、类对象、类属性、类方法、静态方法、__del__方法(析构函数)和垃圾回收机制、__call__方法和可调用对象、方法没有重载_方法的动态性、私有属性和私有方法(实现封装)、@property装饰器、None、面向对象的三大特征说明(封装、继承、多态)、object根类、重写__str__()方法、多重继承、MRO方法解析顺序、super()获得父类定义、特殊方法和运算符重载、特殊属性、继承和组合、

你学会了吗 1241

金蝶云星空-协同开发云-安装开发环境

金蝶协同开发云就是不需要每一个开发都在自己的本机安装开发环境,自己安装可容易出错,包括源代码管理也一并解决了,大大减少了开发人员的工作量和降低了上手的难度。

qq_33881408的博客 5598

python 面向对象全面详解

目录   一、对面向对象的理解 1、面向对象的编程---object oriented programming 2、python面向对象的重要术语: 3、函数和面向对象编程的区别 二、封装、继承、多态 1、封装(Encapsulation) 2、继承(Inheritance) 3、多态(Polymorphism) 三、面向对象的各种方法 1、静态方法  (用这个装饰器来表示 ...

日入上万 5万+

究竟什么是虚拟同步机???虚拟同步机巨简单理解

同步发电机定子铁芯的内圆均匀分布着定子槽,槽内按一定规律嵌放着对称的三相绕组U1-U2、V1-V2、W1-W2,如图1所示。工作原理转子铁芯上装有制成一定形状的成对磁极,磁极上绕有励磁绕组。励磁绕组上通直流电时,会在电机的气隙中形成极性相间的分布磁场,称为励磁磁场。当原动机拖动转子以恒定速度旋转时,励磁磁场随转轴一起旋转并顺次切割定子各相绕组。定子电枢绕组中将会感应出大小和方向周期性变化的三相对称正弦感应电动势。各相电动势大小相等,相位各差120°。

weixin_53126442的博客 2607

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python学习——面向对象高级之反射

本篇是python的面向对象高级篇,主要描述反射、内置属性与方法、元类;为下一篇的ORM框架做好准备。废话不多说,咱就从反射开始吧。 反射 第一次听说反射这个术语,还是在自学Java的时候看到,知道了类的类,怎么通过这个类的类来反射到对象,貌似搞得很复杂,不过基本的思想还是搞明白了。不想,在学python的时候又碰见反射了,个人觉得python的反射比Java要简洁一点。 python面...

zhaoyun_zzz的专栏 788

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python高级(反射(与属性操作相关的魔术方法))

1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) ...

jamfiy的博客 1245

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

26 - 面向对象高级-上下文管理-反射

26 - 面向对象高级-上下文管理-反射 目录 1 上下文管理 1.1 上下文管理的安全性 1.2 返回值 1.3 方法的参数 1.4 计算函数的运行时间 1.5 主要应用场景 1.6 contextlib.contextmanager 2 反射 2.1 反射相关的函数 2.2 反射相关的魔术方法 2.2.1 getattr 2.2.2 se...

tlammon的专栏 171

python基础 day7 面向对象高级语法部分 异常处理 异常处理 Socket开发基础

本节内容: 面向对象高级语法部分 经典类vs新式类   静态方法、类方法、属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序    面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 3 4 5 6 7 8 ...

weixin_30914981的博客 127

python面向对象高级和应用,继承顺序mro和c3算法,自定义异常处理,import_module + 反射

python面向对象高级和应用,继承顺序mro和c3算法,自定义异常处理,import_module + 反射

Python 156

Python(六)面向对象、异常处理、反射、单例模式

本章内容: 创建类和对象 面向对象三大特性(封装、继承、多态) 类的成员(字段、方法、属性) 类成员的修饰符(公有、私有) 类的特殊成员 isinstance(obj, cls) &issubclass(sub, super) 异常处理 反射 单例模式 创建类和对象 面向...

banhute7862的博客 135

Python系列之反射、面向对象

Python系列之反射、面向对象 一、反射 说反射之前先介绍一下import方法,这个和import导入模块的另一种方式 1. import commons 2. __import__('commons') 如果是多层导入: 1. from list.text import commons 2. __import__(' list.text.commons',fromlist=True) ...

QQ群166477105Python技术群 257

Java面向对象高级

本篇文章内容很长,包含java基础中常用的一些知识点

qq_59611746的博客 1117

python高级之面向对象高级

python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(public),私有成员(private)和保护成员(protected).并且python中没有关键字去修饰成员,默认python中所有的成员都是公有成员,但是私有成员是以两个下划线开头的名字标示私...

weixin_34101229的博客 3150

day19 面向对象高级和应用

day19 面向对象高级和应用 版权声明:本博客转载自路飞学城Python全栈开发培训课件,仅用于学习之用,严禁用于商业用途。 欢迎访问路飞学城官网:https://www.luffycity.com/ 课程目标:掌握面向对象高级知识和相关应用。 今日概要 继承【补充】 内置函数【补充】 异常处理 反射 1. 继承【补充】 对于Python面向对象中的继承,我们已学过: 继承存在意义:将公共的方法提取到父类中,有利于增加代码重用性。 继承的编写方式: # 继承 class Base(objec

mannixiang的博客 214

PHP 魔术常量

PHP魔术常量是一组特殊的预定义常量,其值根据使用上下文动态变化。这些常量无需显式声明即可在整个脚本中使用,提供了便捷的方式来访问文件、函数、类等关键信息。通过巧妙设计,魔术常量增强了代码的灵活性和可维护性,同时简化了许多常见编程任务,如错误处理和动态文件包含。这种机制不仅提高了开发效率,还促进了更优雅、更具表现力的编码风格,在复杂项目中尤其有价值。

2401_86544677的博客 886
上一篇: 面向对象进阶——封装、继承、多态
下一篇: 网络架构之C/S架构、B/S架构
Jakey_src
博客等级 码龄9年 10粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值