反射和内置方法
一、反射
反射是动态语言的标志。
反射机制指的是在程序中都可以动态的获取和调用类或者对象属性的机制。
Python中调用对象或者类的属性的时候都是通过类(对象).属性
的方法,当程序执行到这一步的时候,解释器会跑去用dir()
查看该类是否含有这个属性,这个列表中会含有所有的属性,并且是字符串形式的。我们可以使用hasattr,getattr,setattr,delattr
这四种方法实现用字符串去操作属性。
实现反射的步骤:
- 通过
dir()
查看对象或者类所有的字符串形式的属性列表。 - 通过
__dict__[字符串形式的属性值]
来实现将字符串反射到属性值上。
# hasattr:接受两个参数,前者对象或者类,后者为字符串形式的属性值
# 如对象或者类中含有该属性返回#True,否则返回False
hasattr(obj,"a") # True or False
# getattr(objclass,“属性值”,(不存在则返回默认值。可修改))
getattr(obj,"b",(None)) # (属性值结果,函数属性内存地址),不存在则默认None,可修改为其他值
# setattr(objclass,"属性值",value)
setattr(obj,"c","123") # 将对象属性a的值改为"123",不存在则不更改。没有返回值
# delattr(objclass,“属性值”)
delattr(obj,"d") # 该属性存在则删除,不存在报错。
一般是用都会先使用hasattr先对属性值进行判断。然后再进行相关操作。同时记得,getattr如果是函数属性的话,需要在其后加一个括号方能调用,其本身是一个函数的内存地址。
二、内置方法
Python中一切皆为对象,其内部一般都有很多内置方法,即两个下划线开头,两个下划线结尾的方法,这种方法都会在满足其条件的时候自动触发。 每个内置方法都有自己独特的作用。
2.1 _str_
当我们使用print()
的时候实质上就是调用了内部对象的__str__的方法,这个方法会在被打印的时候自动触发,我们可以通过定制化来实现打印的效果。但是注意,返回的必须是字符串类型。
2.2 、_del_
这个内置方法会在对象被删除时执行其下方的代码,这种方法一般是在程序跟外部环境进行交互的时候清除对象,回收系统资源,如果对象只在程序内部使用,那么Python的垃圾回收机制会帮忙做这种事情。