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

相关推荐

  • Linux简单的磁盘分区、格式化和挂载

     一.分区: 1.查看分区fdisk -l 通过fdisk -l 查看机器所挂硬盘个数及分区情况   2.通过上面的信息,我们知道此机器中挂载两个硬盘分别是:/dev/sda和/dev/sdb, 其中sda有两个主分区/dev/sda1和sda2; 其中sdb有1个扩展类型/dev/sdb3和3个逻辑分区sd…

    Linux干货 2016-02-28
  • 第六周-Vim、计划任务及Shell脚本练习

    一、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; cp /etc/rc.d/rc.sysinit /tmp vim /tmp/rc.sysinit 末行模式输入 :%s@^[[:space:]]\+@#&@g 二、复制/boot/grub/grub.co…

    Linux干货 2017-08-13
  • N26-博客作业-week3

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 ~]# who | cut -d” ” -f1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。 ~]# last -n 1 3、取出当前系统上被用户当作其默认shell的最多的那个shell。 ~]# cut /etc/pas…

    Linux干货 2017-02-19
  • net25-第14周作业

    系统的INPUT和OUTPUT默认策略为DROP; ~]# iptables -P INPUT DROP ~]# iptables -P OUTPUT DROP 1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机; ~]#iptables -…

    Linux干货 2017-05-15
  • N24_huamao 学习计划

       每天会安排好时间按顺序看视频进行学习,由于基础比较差我会先进行笔记然后再做博客记录。需要操作的知识点会跟着视频和自己的理解去做,最后达到马哥所说的“技能”所需的要求。运维的知识点很广很多也很复杂。当然想学好后边的就要先打好基础从linux系统开始学习把重要的命令记牢应用灵活才可以。这第一步自己一定要迈好。

    Linux干货 2016-10-26
  • Ansible安装部署及常用模块详解

    Ansible命令使用 Ansible语法使用ansible <pattern_goes_here> -m <module_name> -a <arguments> -m NAME,–module-name=NAME:指定执行使用的模块 -u USERNAME,–user=USERNAME:指定远程…

    2017-07-11