python 类的魔术方法_python面向对象魔术方法

创建:__init__

销毁:__del__

哈希:__hash__

当__hash__ =None时,该类的实例不可哈希

hash值相同不能确定2个对象相同,要__eq__来判断是否相同。

波尔:__bool__,返回的类型为bool,如果没有定义__bool__,看__len__的返回长度,非0为真,如果__len__也没定义,所有实例都返回真。

可视化:__repr__,__str__

若只定以一种,定义__repr__

运算符重载:

<:__lt__>:__gt__、>=:__ge__、!=:__ne__

+:__add__、-:__sub__、*:__mul__、/:__truediv__、%:__mod__、//:__floordiv__、**:__pow__

容器方法:

__iter__:返回一个新的迭代器对象

__getitem__:实现self[key]访问,key不存在引发异常

__setitem__:和__getitem__类似,设置值的方法

__missing__:dict使用__getitem__()调用时,key不存在不报错,执行该方法

可调用对象:

__call__:类中定义了该方法,实例可以像函数一样调用

类中定义了__call__,可以实现把类变成类装饰器

上下文管理:

__enter__和__exit__都定义

__enter__的返回值会变成with语法中的变量(f)

使用 with class() as f:pass调用上下文方法。

定义了上下文管理的类,with语法可以开启一个上下文环境,执行前做一些工作,执行后也做一些工作。可以把其当成一个类装饰器。

反射:

一个对象在运行时可以找出其类型的信息。

具有反射能力的函数:type(),isinstance(),callable(),dir(),getatter()等。

内建函数:

getattr(object,name,default):通过name返回object的属性值,当属性不存在时,返回default,如果没有default,则抛出AttributeError。name必须为字符串

setattr(object,name,value):object的属性存在,则覆盖,不存在,新增

hasattr(object,name):判断对象是否有这个name的属性

反射相关的魔术方法:

__getattr__():一个类的属相会按照继承关系找,如果找不到,就会执行__getattr__方法,如果没有这个方法,就会抛出AttriuteError

__setattr__():可以阻止通过实例增加、修改属性的操作。实例通过点设置属性,如self.x=x,就会调用__setattr__(),而不会直接加到其__dict__中,属性要加到实例的__dict__中,需要自己完成

__delattr__():可以阻止通过实例删除属性的操作

__getattriute__():可以阻止通过实例查找属性的操作,实例的所有属性访问,都会先调用__getattriute__方法

描述器:

用到了三个魔术方法:__get__(),__set__(),__delete__()

一个类含有__get__(),__set__(),__delete__()三个方法中的任意一个,这个类就是描述器

如果仅实现了__get__(),就是非数据描述器

同时实现了__get__()和__set__()就是数据描述器

**如果一个类的类属性是一个描述器的实例,访问这个类属性就会调用__get__方法**

owner就是这个类

**如果描述器是非数据描述器,这个owner的实例的字典优先级高于描述器,如果描述器是数据描述器,这个owner的实例的字典优先级低于于描述器**

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88721

你可能感兴趣的:(python,类的魔术方法)