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 08:54
下一篇 2017-11-20 19:59

相关推荐

  • 磁盘管理

    上图sda disk information中对 255 heads,63 sectors/track,1958 cylinders的解析: sda磁盘总共有1958个cylinder(柱面),每个cylinder(柱面)有63个sectors(扇区),每个sectors(扇区)有255个heads(磁头) 那么这块sda的总的磁头数量为:255*63*19…

    2017-08-20
  • LINUX命令历史

    LINUX命令历史 LINUX的命令历史是什么? linux的命令历史的作用是,记录执行过的命令。如果你经常使用 Linux 命令行,那么使用 命令历史可以有效地提升你的效率。history(管理历史命令)语法:[root@localhost]#history(选项)(参数)选项:n:n为数字,要列出最近的 n 笔命令列表-c(清空所有历史命令)-d (删除…

    2017-09-14
  • N26 第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# useradd tom [root@localhost ~]# echo "123456" | passwd –st…

    Linux干货 2017-01-20
  • 千里眼–用NFS和Samba实现共享网页文件

     目的:使用网络文件系实现LAMP的分步式资源共享 配置过程– 搭建nfs服务器:(centos 6.8) 安装yum install mysql-server nfs-utils httpd #这里安装httpd是为了方便后面共享文件的属主属组定义 启动nfs服务 #service nfs start  mkdir /dat…

    2017-04-30
  • samba服务实现:linux和windows之间共享

    1,首先在linux(centos6,7)安装好samba程序:     yum -y install samba   samba-common        主配置文件:/etc/samba/smb.conf   ~]# groupadd share_gro…

    2017-03-05
  • Nginx/httpd 代理两个Tomcat

    Nginx 前端代理服务器172.16.71.1 从ftp下载Nginx 安装 vim /etc/nginx/nginx.confhttp {…# 添加以下内容upstream tcsrvs {         server 172.16.71.4:8080;        …

    Linux干货 2017-02-12