类的常用魔术方法:无需人为调用,基本是在特定的时刻自动触发,方法名被前后两个下划线包裹

魔术方法,总结表:

__init__:构造函数。初始化的时候调用。

__new__:对象实例化方法,其实这才是类里面第一个被调用的方法,在构造函数之前调用,之后才是__init__,只是这个比较特殊,一般不使用。

__call__:对象当函数的时候触发。

     class A():
         def __init__(self,name = 0):
             print("哈哈,我是构造函数")

         def __call__(self):
             print("我是__call__函数")

     a = A()
     a()    #对象当函数使用,如果没有__call__函数会报错

__str__:当对象被当做字符串使用过的时候调用。

     class A():
         def __init__(self,name = 0):
             print("哈哈,我是构造函数")

         def __str__(self):
             return "我只是一个例子"

     a = A()
     print(a)  #把对象当字符串使用

__repr__:返回字符串,跟__str__函数差不多。

属性操作相关:

__getattr__:访问不存在属性的时候触发。拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法

__setattr__:对成员属性进行设置的时候触发,有三个参数--

1,self用来获取当前对象

2,被设置的属性名称,以字符串形式出现

3,需要对属性名称设置的值

作用:进行属性设置的时候进行验证或者修改。
        会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self,__setattr__("attr", value).这个需要注意。

        当在__setattr__方法内对属性进行赋值是,不可使用self.attr = value,因为他会再次调用self,__setattr__("attr", value),则会形成

        无穷递归循环,最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__['name'] = value.

     A():
         def __init__(self):
             pass
         def __setattr__(self, name, value):
             print("设置属性:{0}".format(name))
             self.name = value        #这句语句会导致死循环

     a = A()
     a.age = 18

所以为了避免死循环,规定统一调用父类魔法函数:

     class A():
         def __init__(self):
             pass
         def __setattr__(self, name, value):
             print("设置属性:{0}".format(name))
             super().__setattr__(name,value)    #super函数调用父类,避免死循环

     a = A()
     a.age = 18

如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。

     # -*- coding:utf-8 -*-
     class DataTest:
         def __init__(self,id,address):
             self.id=id
             self.address=address
             self.d={self.id:1,
                     self.address:"192.168.1.1"
                     }

         def __getitem__(self,key):
             return "hello"

     data=DataTest(1,"192.168.2.11")
     print data[2] 

__xxxitem__: 当以[ ” “ ] 的方式访问属性时,就会调用此类型的方法

setitem:当属性被以索引方式赋值的时候会调用该方法

getitem:一般如果想使用索引访问元素时,就可以在类中定义这个方法

delitem:当使用索引删除属性时调用该方法

实例

 __Author__ = "Lance#"

 # -*- coding = utf-8 -*-

 class Point:
     def __init__(self):
         pass

     def __str__(self):
         return 'Point is (%s,%s)' %(self.x, self.y)

     def __setitem__(self, key, value):
         print('Called the __setitem__ function')
         self.__dict__[key] = value

     def __getitem__(self, item):
         print('Called the __getitem__ function')
         try:
             if item == 'x':
                 return '%s' %self.x
             elif item == 'y':
                 return '%s' %self.y
         except:
             return 'There is no this item in class Point'

     def __delitem__(self, key):
         del self.__dict__[key]

 if __name__ == '__main__':
     p = Point()
     p['x'] = 3
     print(p['x'])
     p['y'] = 6
     print(p)
     del p['x']
     print(p['x'])

运行结果

 Called the __setitem__ function
 Called the __getitem__ function
 3
 Called the __setitem__ function
 Point is (3,6)
 Called the __getitem__ function
 There is no this item in class Point

 Process finished with exit code 0
 

Python 基础之class魔术方法的更多相关文章

  1. python类:magic魔术方法

    http://blog.csdn.net/pipisorry/article/details/50708812 魔术方法是面向对象Python语言中的一切.它们是你可以自定义并添加"魔法&q ...

  2. (转)python类:magic魔术方法

    原文:https://blog.csdn.net/pipisorry/article/details/50708812 版权声明:本文为博主皮皮http://blog.csdn.net/pipisor ...

  3. Python扩展之类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  4. PHP基础知识之魔术方法

    __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sle ...

  5. Python中的常用魔术方法介绍

    1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 参数:至少有一个self,接收对象 返回值:无 作用:初始化对象的成员 注意:使用该方式初 ...

  6. Python基础数据类型以及对应方法

    数据类型 不可变数据(四个):Number(数字).String(字符串).Tuple(元组).Sets(集合):可哈希 可变数据(两个):List(列表).Dictionary(字典).不可哈希 字 ...

  7. python基础-生成随机字符串方法

    python解释器示例 >>> import uuid >>> uuid.uuid1() UUID('ae6822e6-c976-11e6-82e0-0090f5f ...

  8. Python学习笔记:魔术方法详解

    准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...

  9. Python基础7:字符串方法

    1 * 重复输出字符串 print('helo '*4) 2 [],[:] 通过索引获取字符串中的字符,这里和列表中的切片操作是相同的,具体内容见列表 print('hello word'[2:]) ...

随机推荐

  1. Redis学习笔记:windows上redis的安装运行

    Redis的windows版本地址https://github.com/MicrosoftArchive/redis 下载之后解压之 在当前解压目录下可以看到如下文件 在当前目录下打开命令行窗口,输入 ...

  2. JavaScript学习笔记:基础知识点总结

    基础概念 JavaScript(以下简称Js)中数据类型:Number 字符串 布尔值 数组 对象(Js的对象是一组由键值对组成的无序集合) Js中基础概念:变量(概念和Java中变量概念类似 指示某 ...

  3. 【Web】Nginx配置开机启动

    在添加nginx服务之后,大家会希望开机伴随启动nginx,避免手动路径输入启动: nginx官方提供了启动脚本:https://www.nginx.com/resources/wiki/start/ ...

  4. 【Linux】CentOS 7.2 安装 MySQL 5.7.21 解压版

    安装环境/工具 1.Linux(CentOS 7.2版) 2.mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz 安装步骤 1.下载mysql解压版(mysql-5. ...

  5. Linux上安装java+tomcat+mysql运行环境

    centos6.5jdk"1.7.0_79"mysql5.6apache-tomcat-7.0.53 安装jdk:1.先到oracle下载rpm包:jdk-7u80-linux-x ...

  6. c#的装箱和拆箱及值类型和引用类型

    装箱:它允许根据值类型创建一个对象,然后使用对这新对象的一个引用. int i = 5; object o = i; int j = (int)o; 装箱:运行时将在堆上创建一个包含值5的对象(它是一 ...

  7. Sencha extjs 的安装

    delphi 的母公司Idera 突然就把sencha extjs 收购了,这确实是一个很好的消息,意味着delphi 开始在web方面开始发力, 目前delphi 集成extjs 的呼声越来越强烈, ...

  8. 2018.12.18 bzoj5296: [Cqoi2018]破解D-H协议(bsgs)

    传送门 bsgsbsgsbsgs基础题. 考虑到给的是原根,因此没无解的情况. 于是只需要每次把a,ba,ba,b解出来. 然后可以通过预处理节省一部分时间. 代码: #include<bits ...

  9. jquery选择树:CheckTree 插件

    在做权限等提交的时候,需要用到选择树.比较了很多插件如:easyUI 树,ztree等等.本来决定自己写,但是到最后还是发现了checkTree这个插件.省了很多事情. 但是在引用过程中还是出现了一些 ...

  10. xml 转 数组

    function xml_to_array($xml){ if(!$xml){ return false; } //将XML转为array //禁止引用外部xml实体 libxml_disable_e ...