第十三章、面向过程高阶
目录
第十三章、面向过程高阶
一、isinstance和issubclass
isintance和type的区别
class A(): pass class B(A): pass b=B() print(type(b))#谁实例化的对象就是谁 #------------------------ <class '__main__.B'> #------------------------ print(isinstance(b,A))#True print(isinstance(b,B))#True
isinstance和issubclass的区别
issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类。
语法
以下是 issubclass() 方法的语法:
issubclass(class, classinfo)
参数
class --(子) 类。
classinfo -- 类。
返回值
如果 class 是 classinfo 的子类返回 True,否则返回 False。
二、反射(hasattr、getattr、setattr和delattr)
反射的本质:F.__dict__[run](p)
所以能像操作字典那样操作增删改查
. hasattr:判断一个方法是否存在与这个类中 用法:hasattr(对象,字符串)
2. getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行。或者返回属性值 用法:getattr(对象,字符串)
3. setattr:通过setattr将外部的一个函数绑定到实例中 用法:setattr(对象,属性,属性值)
4. delattr:删除一个实例或者类中的方法
hasattr()
print(hasattr(peo1, 'eat')) # peo1.eat ------------------------------- True
getattr()
class People: country = 'China' def __init__(self, name): self.name = name def eat(self): print('%s is eating' % self.name) def xxxxx(self): print('调用我了') peo1 = People('nick') getattr(peo1, 'xxxxx')()#获取了方法地址,括号调用方法 -------------------------------------------------- 调用我了 -------------------------------------------------- getattr(dd, inp_func,None)#没有找到inp_func会返回none
setattr()
setattr(peo1, 'age', 18) # peo1.age=18 print(peo1.age) print(peo1.__dict__) ------------------------------------------ 18 {'name': 'nick', 'age': 18}
delattr()
delattr(peo1, 'name') # del peo1.name print(peo1.__dict__) ---------------------------------------- {'age': 18}
- 模块应用
# dynamic.py imp = input("请输入模块:") dd = __import__(imp) # 等价于import imp inp_func = input("请输入要执行的函数:") f = getattr(dd, inp_func,None) # 作用:从导入模块中找到你需要调用的函数inp_func,然后返回一个该函数的引用.没有找到就烦会None f() # 执行该函数
三、__setattr__和__delattr__和__getattr__
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 # 这就无限递归了,你好好想想
# self.__dict__[key] = value # 应该使用它
def __delattr__(self, item):
print('----> from delattr')
# del self.item # 无限递归了
self.__dict__.pop(item)
f1 = Foo(10)
print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
f1.z = 3
print(f1.__dict__)
f1.__dict__['a'] = 3 # 我们可以直接修改属性字典,来完成添加/修改属性的操作
del f1.a
print(f1.__dict__)
class A:
def __init__(self,name):
self.name='nick'
def __delattr__(self, item):#重写了delattr(),没有删除的效果
print(f'删了{item}')
p=A('name')
print(p.name)
delattr(p,'name')
print(p.name)
---------------------------------------------
nick
删了name
nick
四、__call__
说明:凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable
如果在类中实现了 call 方法,那么实例对象也将成为一个可调用对象,
class Entity:
'''调用实体来改变实体的位置。'''
def __init__(self, size, x, y):
self.x, self.y = x, y
self.size = size
def __call__(self, x, y):
'''改变实体的位置'''
self.x, self.y = x, y
e = Entity(1, 2, 3) // 创建实例
e(4, 5) //实例可以象函数那样执行,并传入x y值,修改对象的x y
print(e.x,e.y)
-----------------------
4 5
五、__str__和__repr__
__str__
class Foo: def __init__(self, name, age): """对象实例化的时候自动触发""" self.name = name self.age = age def __str__(self): return f'我的名字{self.name},年龄{self.age}' #return [1]# 如果不返回字符串类型,则会报错 obj = Foo('nick', 18) print(obj) ----------------------------------------- 我的名字nick,年龄18
__repr__
- str函数或者print函数--->obj.__str__()
- repr或者交互式解释器--->obj.__repr__()
- 如果__str__没有被定义,那么就会使用__repr__来代替输出
- 注意:这俩方法的返回值必须是字符串,否则抛出异常
六、实现文件上下文管理(__enter__和__exit__)
- 我们知道在操作文件对象的时候可以这么写
with open('a.txt') as f:
'代码块'
上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法
exit()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行
如果__exit()返回值为True,那么异常会被清空,就好像啥都没发生一样,with后的语句正常执行
优点:
使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处
原文地址:https://www.cnblogs.com/demiao/p/11449113.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- windows10在visual studio2019下配置使用openCV4.3.0
- PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
- Python爬虫爬取新闻资讯案例详解
- Python代码需要缩进吗
- 解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
- Python计算信息熵实例
- 详解python logging日志传输
- 将tf.batch_matmul替换成tf.matmul的实现
- Python正则表达式高级使用方法汇总
- CentOS7.0下安装PHP5.6.30服务的教程详解
- Laravel Validator自定义错误返回提示消息并在前端展示
- 完美解决keras 读取多个hdf5文件进行训练的问题
- keras:model.compile损失函数的用法
- PHP获取当前系统时间的方法小结
- PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例