属性管理函数:
getattr(obj, name[, default]) 【【【得到】】】
从一个对象得到对象的属性;getattr(x, 'y') 等同于x.y; 当属性不存在时,如果给出
default参数,则返回default,如果没有给出default 则产生一个AttributeError错误
示例1:getattr(c,'brand','没有brand属性')
hasattr(obj, name) 【【【判断】】】
用给定的name返回对象obj是否有此属性,此种做法可以避免在getattr(obj, name)
时引发错误
setattr(obj, name, value)
【【【设定】】】
给对象obj的名为name的属性设置相应的值value, setattr(x, 'y', v) 等同于 x.y = v
delattr(obj, name) 【【【设置】】】
删除对象obj中的name属性, delattr(x, 'y') 等同于 del x.y
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
异常(高级):
with语句
语法
with 表达式i1 [as,变量名1],表达式2 [as 变量名2].....
作用:
用于对资源访问的场所,确定使用资源的过程中不管是否发生异常,都会执行
必要的‘清理’操作,并释放资源
如:
文件打开后自动关闭,过程中锁的自动获取和释放
说明:
with语句与try-finally相似,并不一定有异常状态
as 子句用于绑定表达式创建的对象
环境管理器:
类内有__enter__和__exit__方法的类被称为——环境管理器
能够用with进行管理的对象必须是环境管理器
__enter__
将在进入with语句时被调用,并返回由as变量管理的对象
__exit__
将在离开with语句时被调用,且可以用参数来判断离开with语句时是否出现
异常,并作出相应处理
——————————————————
练习:实现文件的复制(建议二进制)
python3 mycp.py
请输入源文件:/etc/passwd
请输入目标文件:./mypass.txt
提示:‘文件复制成功’或‘文件复制失败’
(建议 with语句打开)
def mycp(src_file,dst_file):
try:
with open(src_file,'rb') as f1,\
open(dst_file,'wb') as f2:
while True:
b = f1.read(4096)
if not b:
break
f2.write(b)
except:
return False
return True
def main():
src = input('请输入源文件名')
dst = input('请输入目标文件名')
if mycp(src,dst):
print('复制文件成功')
else:
print('复制文件失败')
main()
→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
运算符重载:
什么是运算符重载
让自定义的类生成的对象(实例)能够使用运算符进行操作
作用:
让实例像数学表达式一样进行运算操作
让程序简介易读
说明:
运算符重载方法的参数已经有固定的含义,不建议改变原有的含义
算术运算符:
方法名 运算符
__add__ 加法 +
__sub__ 减法 -
__mul__ 乘法 *
__truediv__ 除法 /
__floordiv__ 地板除 //
__mod__ 取模(求余)%
__pow__ 幂 **
二元运算符重载方法格式:
def __xxx__(self,other):
....
练习:
实现两个自定义表的相加
class Mylist:
def __init__(self,iterable):
self.data = [x for x in iterable]
L1 = Mylist([1,2,3])
L2 = Mylist([range(4,7))
L3 = L1 + L2
☆☆☆☆☆☆☆☆
☆☆☆☆☆☆☆☆
运算方式由+前边的L1决定,L1属于Mylist,因此用定义的__add__
print(L3)
L4 = L1 * 2
print(L4)
反向算术运算符:
方法名 运算符
__radd__ 加法 +
__rsub__ 减法 -
__rmul__ 乘法 *
__rtruediv__ 除法 /
__rfloordiv__ 地板除 //
__rmod__ 取模(求余)%
__rpow__ 幂 **
复合赋值运算符重载(算术):
方法名 运算符
__iadd__ 加法 +=
__isub__ 减法 -=
__imul__ 乘法 *=
__itruediv__ 除法 /=
__ifloordiv__ 地板除 //=
__imod__ 取模(求余)%=
__ipow__ 幂 **=
比较运算符的重载
__lt__ < 小于
__le__ <= 小于等于
__gt__ > 大于
__ge__ >= 大于等于
__eq__ == 等于
__ne__ != 不等于
注:
比较运算符通常返回True或者False
位运算符重载:
__inert__ ~ 取反(一元运算符)
__and__ & 位与(交集)
__or__ | 位或(并集)
__xor__ ^ 位异或(对称补集)
__lshift__ << 左移
__rshift__ >> 右移
反向位运算符重载:
同算术运算符相同
__rand__ & 位与(交集)
__ror__ | 位或(并集)
__rxor__ ^ 位异或(对称补集)
__rlshift__ << 左移
__rrshift__ >> 右移
复合赋值运算符重载:(集合)
__iand__ & 位与(交集)
__ior__ | 位或(并集)
__ixor__ ^ 位异或(对称补集)
__ilshift__ << 左移
__irshift__ >> 右移
一元运算符的重载:
__neg__ - 负号
__pos__ + 正号
__invert__ ~ 按位取反
格式:
def __xxx__(self):
...
in/not in 运算符的重载
格式:
def __contains__(self,e):
...
说明:
not in 相当于in取反,所以只需要重载in即可
索引和切片运算符的重载:
重载方法:
__getitem__(self,i) 用于索引/切片取值
__setitem__(self,i) 用于索引/切片赋值
__delitem__(self,i) 用于del语句删除索引操作
作用:
让自定义的类型的对象能够支持索引和切片操作
示例:502test4.py
L = [1,2,3,4,5,6,7,8]
L[::2] # 等同于L[slice(None,None,2)]