python面向对象魔术方法

python面向对象魔术方法

创建:__init__
销毁:__del__

哈希:__hash__
当__hash__ =None时,该类的实例不可哈希
hash值相同不能确定2个对象相同,要__eq__来判断是否相同。

波尔:__bool__,返回的类型为bool,如果没有定义__bool__,看__len__的返回长度,非0为真,如果__len__也没定义,所有实例都返回真。
可视化:__repr__,__str__
若只定以一种,定义__repr__

运算符重载:
<:__lt__、<=:__le__、==:__eq__、>:__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

(0)
10590628461059062846
上一篇 2017-11-20
下一篇 2017-11-20

相关推荐

  • wed服务基础·httpd基础配置详解

    一、 Web Service基础: service:计算机后台提供的功能或计算机可以提供的某一种功能 Web Service本质:通过网络调用其它网站的资源 根据来源的不同,分为两种服务: 本地服务:使用同一台机器提供的服务,不需要网络 网络服务:使用另一台机器提供的服务,需要网络   IANA互联网地址授权机构(Internet Assigned…

    2017-06-09
  • Linux下find命令的使用

    为什么要使用find命令?     Linux系统中有着成千上万的文件,如果你想要找到自己想要的文件,一款查找软件是必不可少的,而locate是根据其生成的数据库进行查找,虽然速度会略快,但非实时查找,有些新的文件或目录是匹配不到的,而且locate是模糊匹配,而find命令为实时查找,且为精确匹配,如果你对目录的权限…

    Linux干货 2016-08-18
  • grep的基本用法详解

     grep是linux上常用的一个文本处理工具之一。它有着强大的文本处理能力,学会它,可以让工作更有效率。 一、初识grep   grep: Global search Regular Experssion and Print out line   从名字上也可以直观的了解到它是基于正则表达式进行全局搜索,并把结果打印到屏幕上来…

    系统运维 2015-05-25
  • Lvm的创建

    一、LVM相关基础:     PE:类似与磁盘的block,这个的大小也会影响VG的大小     PV:是磁盘分区或逻辑上与磁盘分区具有相同功能的设备(RAID),是LVM的基本存储模块,但与基本的物理存储模块相比,却包含有lvm相关的参数     VG:类似于非lvm系统中的物理磁盘,包含多个pv     LV:类似于非lvm系统中的磁盘分区   PV相关…

    2016-04-10
  • 马哥第一天

    来这儿的第一天

    2018-03-26
  • lvs DR模型

    LVS 负载均衡 使用lvs部署负载均衡服务器  实现4层tcp调度 lvs一共四种模式   分别是NAT  DR  TUN和FullNAT模式 NAT模式和DR模式部署相对简单而且实用性强 现在部署一下  LVS的DR模型 首先准备三台主机  使用的三台系统都是centos 7…

    2017-05-15