python类与对象之反射和内置方法

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__.

需要注意的是:

  1. `` exit()`中的三个参数分别代表异常类型,异常值和追溯信息

  2. with语句中代码块出现异常时,会立即触发方法__exit__的执行,并将异常信息错误参数传入

  3. with语句中代码块未出现异常正常结束时也会触发方法__exit__的执行,此时参数中的异常信息为空

  4. 如果__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)时的行为
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值