博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Learning-Python【26】:反射及内置方法
阅读量:5239 次
发布时间:2019-06-14

本文共 2149 字,大约阅读时间需要 7 分钟。

反射的概念

可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),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:    passclass Son(Foo):    passs = 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))
View Code

内置方法

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.namef = 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__
View Code

2、__del__:会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源

class Foo:    def __del__(self):        print('===>')obj=Foo()# del objprint('其他代码...')
View Code

 

转载于:https://www.cnblogs.com/qiuxirufeng/p/9850891.html

你可能感兴趣的文章
css3基础篇二
查看>>
进程间的八种通信方式----共享内存是最快的 IPC 方式
查看>>
DPDK初始化流程
查看>>
MEF: MSDN 杂志上的文章(14) 稳定的组合
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
BNU29140——Taiko taiko——————【概率题、规律题】
查看>>
POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】
查看>>
java 得到以后的日期
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
python安装easy_intall和pip
查看>>
AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
查看>>
宏脚本链接数据库
查看>>
HDU1004
查看>>
MySQL高速缓存
查看>>
DropdownList绑定的两种方法
查看>>
价值观
查看>>
数值计算中,浮点类型给我们挖的坑
查看>>