Python3零基础学习笔记十六

时间:2021-01-23 06:36:47
属性管理函数:
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)]