Learning-Python【26】:反射及内置方法
反射的概念
可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python 中一切皆对象,都可以使用反射。
反射有四种方法:
hasattr:hasattr(object, name)判断一个对象是否有 name 属性或者 name 方法。有就返回 True,没有就返回 False
getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr 和 getattr 配套使用
需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()
setattr:给对象的属性赋值,若属性不存在,先创建后赋值
delattr:删除该对象指定的一个属性
class Foo():
def __init__(self, name, age):
self.name = name
self.age = age def tell_info(self):
print('%s: %s' %(self.name, self.age)) obj = Foo("egon", 18) print(hasattr(obj, "name")) res1 = getattr(obj, "name")
print(res1)
res2 = getattr(obj, "xxx", None)
print(res2) setattr(obj, "age", 38)
print(obj.__dict__)
setattr(obj, "gender", "male")
print(obj.__dict__) delattr(obj, "name")
print(obj.__dict__)
反射
isinstance 和 issubclass
isinstance(obj, cls):检查 obj 是不是 cls 的对象(传两个参数,一个是对象,一个是类)
issubclass(sub, super):检查 sub 是不是 super 的子类(传两个参数,一个是子类,一个是父类)
class Foo:
pass class Son(Foo):
pass s = Son()
print(isinstance(s, Son)) # 判断s是不是Son的对象
print(type(s) is Son)
print(isinstance(s, Foo)) # 判断s是不是Foo的对象 不精准
print(type(s) is Foo) # type比较精准 print(issubclass(Son, Foo)) # 判断Son是不是Foo的子类
print(issubclass(Son, object))
print(issubclass(Foo, object))
print(issubclass(int, object))
内置方法
1、__str__ 和 __repr__:改变对象的字符串显示
class Foo:
def __init__(self, name):
self.name = name def __repr__(self):
return 'obj in str' # 这里只能是return
# def __str__(self):
# return '%s obj in str'%self.name f = Foo('egon')
print(f) # 优先执行__str__里面的内容
# 那么你是不是觉得__repr__没用呢?
# print('%s'%f) #执行的是__str__里面的返回值
# print('%r'%f) #执行的是__repr__里面的返回值
print('==============')
print(str(f)) # 当执行str(f)时,会去找__str__这个方法,如果找不到的时候,__repr__这个方法就给替补了
print(repr(f))
# 1.当打印一个对象的时候,如果实现了__str__方法,打印__str__中的返回值
# 2.当__str__没有被实现的时候,就会调用__repr__方法
# 3.但是当你用字符串格式化的时候,%s和%r会分别调用__str__和__repr__方法
# 4.不管是在字符串格式化的时候还是在打印对象的时候,__repr__方法都可以作为__str__方法的替补,但反之则不行
# 5.用于友好的表示对象。如果__str__和__repr__方法你只能实现一个: 先实现__repr__
2、__del__:会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源
class Foo:
def __del__(self):
print('===>') obj=Foo()
# del obj
print('其他代码...')
Learning-Python【26】:反射及内置方法的更多相关文章
- python面向对象 : 反射和内置方法
一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类 (注:type(对象名) is 类名 : 判断对象所属 ...
- 《Python》反射、内置方法(__str__,__repr__)
一.反射 通过字符串的形式操作对象相关的属性.(使用字符串数据类型的变量名来获取这个变量的值) Python中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...
- python 面向对象反射以及内置方法
一.反射 什么是反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用放射. 反射的四种方法: hasattr:hasattr(objec ...
- python 面向对象之反射及内置方法
面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- 面向对象(五)——isinstance与issubclass、反射、内置方法
isinstance与issubclass.反射.内置方法 一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,cla ...
- Python 数据类型常用的内置方法(三)
目录 Python 数据类型常用的内置方法(三) 1.列表内置方法 1.sort():升序 2.reverse():颠倒顺序 3.列表比较运算 2.字典内置方法 1.对Key的操作 2.len( )- ...
- Python 数据类型常用的内置方法(二)
目录 Python 数据类型常用的内置方法(二) 1.字符串类型常用内置方法 1.upper.lower.isupper.islower 2.startswith.endswith 3.format ...
- Python 数据类型常用的内置方法(一)
目录 Python 数据类型常用的内置方法 1.整型 int 2.浮点型 float 字符串转浮点型: 3.字符串 str 多种类型转字符型: 索引 切片 len( )方法:统计字符串长度/个数 移除 ...
- python面向对象之反射和内置方法
一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...
随机推荐
- 前端上传 base64 编码图片到七牛云存储
参考文档 如何上传base64编码图片到七牛云 调试过程 文档中分别有 java 和 html 的 demo,可以根据文档示例调试. 下面是我调试的过程,可以作为参考,特别注意的是,如果需要给文件起名 ...
- P1115 最大子段和
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NNN,表示了序列的长度. 第二行包含NNN个绝对值不大于100001000010000的 ...
- vue的数据绑定和组件化
组件:就是自定义标签, 也是Vue的实例对象; 组件好处:就像工作分工,函数封装等 组件分为全局组件和局部组件: 全局组件,在Vue身上的组件,所有的vue挂载的元素内都可以使用:正是因为这一点,co ...
- curl HTTP Header
对于"User-Agent", "Cookie", "Host"这类标准的HTTP头部字段,通常会有另外一种设置方法.curl命令提供了 ...
- kill、killall、pkill杀手三人组
1.1 kill.killall.pkill杀手三人组 1.利用kill 进程号 方式杀掉rsync进程 [root@backup ~]# ps -ef |grep rsync root 3500 1 ...
- python学习之旅(十五)
Python基础知识(14):函数(Ⅴ) 一.装饰器 decorator:本质上就是函数,可以增强函数的功能. 定义起来虽然有点复杂,但使用起来非常灵活和方便 1.不修改被装饰函数的源代码 2.不修改 ...
- 如果报错,使用 journalctl -f -t etcd 和 journalctl -u etcd 来定位问题。
如果报错,使用 journalctl -f -t etcd 和 journalctl -u etcd 来定位问题.
- C++/C面试题(2)
(1)单向链表操作 1)在链表尾部插入一个节点 void addNewNodeTail(ListNode **HeadNode, int value)//在链表尾部插入一个节点{ ListNode* ...
- TypeError: object() takes no parameters
1.定义了类,在类中实现函数功能,但是需要传参数,我在类中没有建立__init__(self,) 导致没法传参.
- 实现mybash
任务内容 1.使用fork,exec,wait实现mybash 查找资料: fork函数 通过fork()系统调用我们可以创建一个和当前进程印象一样的新进程.我们通常将新进程称为子进程,而当前进程称为 ...