python类与对象之反射和内置方法
反射
在Python中,反射指的是通过字符串来操作对象的属性,涉及到四个内置函数的使用。
Python中一切皆对象,类和对象都可以用下述四个方法–>hasattr(),getattr(),setattr(),delattr()
class People():
name = ""
age = 10
def __init__(self,age):
# self.name = name
self.age=age
p=People(10)
# hasattr(object,'name')
print(hasattr(p,'name')) # 按字符串'name'判断有无属性p.name
# getattr(object, 'name', default=None)
print(getattr(p,'name')) # 等同于p.name,不存在该属性则返回默认值None
# setattr(x, 'y', v)
setattr(p,'name',"Jerry") # 等同于p.name="Jerry"
print(getattr(p,'name'))
# delattr(x, 'y')
delattr(People,'name') # 等同于del p.name
print(hasattr(People,'name'))
内置方法
操作独享属性时自动触发
方法 | 描述 |
---|---|
__setattr__ | 使用点语法添加/修改属性会触发它的执行 |
__delattr__ | 使用点语法删除属性的时候会触发 |
__getattr__ | 使用点语法调用属性且属性不存在的时候才会触发 |
__getattribute__ | 使用点语法调用属性的时候触发,无论属性是否存在都会执行 |
注意:当__getattribute__
与__getattr__
同时存在时,仅执行__getattribute__
操作对象属性时自动触发
方法 | 描述 |
---|---|
__getitem__ | 使用key的形式获取属性时触发 |
__setitem__ | 使用key的形式添加/修改属性时触发 |
__delitem__ | 使用key的形式删除属性时触发 |
描述符
描述符本质就是一个类,在这个新式类中,至少实现了__get__()
,__set__()
,__delete__()
中的一个,也被称为描述符协议
方法 | 描述 |
---|---|
__get__() | 调用一个属性时,触发 |
__set__() | 为一个属性赋值时,触发 |
__delete__() | 采用del删除属性时,触发 |
对象的显示相关函数
方法 | 描述 |
---|---|
__str__ | 调用str函数或者print函数时自动执行,返回值作为显示内容 |
__repr__ | 调用repr或者交互式解释器输出对象是自动执行,返回值作为显示内容 |
__format__ | 调用format函数时自动执行,用于定制对象的格式化输出 |
注意:如果__str__
没有被定义,那么就会使用__repr__
来代替输出 ,这俩方法的返回值必须是字符串,否则抛出异常
其他
方法 | 描述 |
---|---|
__doc__ | 这是一个隐藏属性,用于获取类的帮助文档, 其实就是类下面的多行注释 |
__del__ | 当对象在内存中被释放时,会自动触发执行。 |
__enter__ | __enter__ 出现with 语句,对象的__enter__ 被触发,有返回值则赋值给as声明的变量 |
__exit__ | with中代码块执行完毕时执行 |
__call__ | __call__ 是一个函数,在对象被调用时执行,调用就是加括号() |
__init__ | 构造方法的执行是由创建对象触发的 |
__slots__ | 限制类的属性 |
__len__ | 实现了它才能被len()方法调用 |
__iter__``__next__ | iter()和__next__() 配合将类变成Iterator |
__new__ | new() 创建实例self |
__init__ | 初始化,用self去绑定属性 |
注意:
构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()的区别
为什么需要析构方法
如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__
,因为python会自动完成所有资源的回收;
如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就用到了__del__
.
需要注意的是:
-
`` exit()`中的三个参数分别代表异常类型,异常值和追溯信息
-
with语句中代码块出现异常时,会立即触发方法
__exit__
的执行,并将异常信息错误参数传入 -
with语句中代码块未出现异常正常结束时也会触发方法
__exit__
的执行,此时参数中的异常信息为空 -
如果
__exit__()
返回值为True,那么异常会被清空,就好像啥都没发生一样,with后的语句正常执行
总结:
1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处
3.只要这个一个类实现了这两个方法就可以被with 语句使用
总结
方法 | 描述 |
---|---|
基本的魔法方法 | |
new(cls[, …]) | 1. new 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法 3. new 决定是否要使用该 init 方法,因为 new 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 new 没有返回实例对象,则 init 不会被调用 4. new 主要是用于继承一个不可变的类型比如一个 tuple 或者 string |
init(self[, …]) | 构造器,当一个实例被创建的时候调用的初始化方法 |
del(self) | 析构器,当一个实例被销毁的时候调用的方法 |
call(self[, args…]) | 允许一个类的实例像函数一样被调用:x(a, b) 调用 x.call(a, b) |
len(self) | 定义当被 len() 调用时的行为 |
repr(self) | 定义当被 repr() 调用时的行为 |
str(self) | 定义当被 str() 调用时的行为 |
bytes(self) | 定义当被 bytes() 调用时的行为 |
hash(self) | 定义当被 hash() 调用时的行为 |
bool(self) | 定义当被 bool() 调用时的行为,应该返回 True 或 False |
format(self, format_spec) | 定义当被 format() 调用时的行为 |
有关属性 | |
getattr(self, name) | 定义当用户试图获取一个不存在的属性时的行为 |
getattribute(self, name) | 定义当该类的属性被访问时的行为 |
setattr(self, name, value) | 定义当一个属性被设置时的行为 |
delattr(self, name) | 定义当一个属性被删除时的行为 |
dir(self) | 定义当 dir() 被调用时的行为 |
get(self, instance, owner) | 定义当描述符的值被取得时的行为 |
set(self, instance, value) | 定义当描述符的值被改变时的行为 |
delete(self, instance) | 定义当描述符的值被删除时的行为 |
比较操作符 | |
lt(self, other) | 定义小于号的行为:x < y 调用 x.lt(y) |
le(self, other) | 定义小于等于号的行为:x <= y 调用 x.le(y) |
eq(self, other) | 定义等于号的行为:x == y 调用 x.eq(y) |
ne(self, other) | 定义不等号的行为:x != y 调用 x.ne(y) |
gt(self, other) | 定义大于号的行为:x > y 调用 x.gt(y) |
ge(self, other) | 定义大于等于号的行为:x >= y 调用 x.ge(y) |
算数运算符 | |
add(self, other) | 定义加法的行为:+ |
sub(self, other) | 定义减法的行为:- |
mul(self, other) | 定义乘法的行为:* |
truediv(self, other) | 定义真除法的行为:/ |
floordiv(self, other) | 定义整数除法的行为:// |
mod(self, other) | 定义取模算法的行为:% |
divmod(self, other) | 定义当被 divmod() 调用时的行为 |
pow(self, other[, modulo]) | 定义当被 power() 调用或 ** 运算时的行为 |
lshift(self, other) | 定义按位左移位的行为:<< |
rshift(self, other) | 定义按位右移位的行为:>> |
and(self, other) | 定义按位与操作的行为:& |
xor(self, other) | 定义按位异或操作的行为:^ |
or(self, other) | 定义按位或操作的行为:| |
反运算 | |
radd(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rsub(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rmul(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rtruediv(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rfloordiv(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rmod(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rdivmod(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rpow(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rlshift(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rrshift(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rand(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
rxor(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
ror(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
增量赋值运算 | |
iadd(self, other) | 定义赋值加法的行为:+= |
isub(self, other) | 定义赋值减法的行为:-= |
imul(self, other) | 定义赋值乘法的行为:*= |
itruediv(self, other) | 定义赋值真除法的行为:/= |
ifloordiv(self, other) | 定义赋值整数除法的行为://= |
imod(self, other) | 定义赋值取模算法的行为:%= |
ipow(self, other[, modulo]) | 定义赋值幂运算的行为:**= |
ilshift(self, other) | 定义赋值按位左移位的行为:<<= |
irshift(self, other) | 定义赋值按位右移位的行为:>>= |
iand(self, other) | 定义赋值按位与操作的行为:&= |
ixor(self, other) | 定义赋值按位异或操作的行为:^= |
ior(self, other) | 定义赋值按位或操作的行为:|= |
一元操作符 | |
pos(self) | 定义正号的行为:+x |
neg(self) | 定义负号的行为:-x |
abs(self) | 定义当被 abs() 调用时的行为 |
invert(self) | 定义按位求反的行为:~x |
类型转换 | |
complex(self) | 定义当被 complex() 调用时的行为(需要返回恰当的值) |
int(self) | 定义当被 int() 调用时的行为(需要返回恰当的值) |
float(self) | 定义当被 float() 调用时的行为(需要返回恰当的值) |
round(self[, n]) | 定义当被 round() 调用时的行为(需要返回恰当的值) |
index(self) | 1. 当对象是被应用在切片表达式中时,实现整形强制转换 2. 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 index 3. 如果 index 被定义,则 int 也需要被定义,且返回相同的值 |
上下文管理(with 语句) | |
enter(self) | 1. 定义当使用 with 语句时的初始化行为 2. enter 的返回值被 with 语句的目标或者 as 后的名字绑定 |
exit(self, exc_type, exc_value, traceback) | 1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么 2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作 |
容器类型 | |
len(self) | 定义当被 len() 调用时的行为(返回容器中元素的个数) |
getitem(self, key) | 定义获取容器中指定元素的行为,相当于 self[key] |
setitem(self, key, value) | 定义设置容器中指定元素的行为,相当于 self[key] = value |
delitem(self, key) | 定义删除容器中指定元素的行为,相当于 del self[key] |
iter(self) | 定义当迭代容器中的元素的行为 |
reversed(self) | 定义当被 reversed() 调用时的行为 |
iter(self) | 定义当迭代容器中的元素的行为 |
reversed(self) | 定义当被 reversed() 调用时的行为 |
contains(self, item) | 定义当使用成员测试运算符(in 或 not in)时的行为 |