Python 基础之class魔术方法
类的常用魔术方法:无需人为调用,基本是在特定的时刻自动触发,方法名被前后两个下划线包裹
魔术方法,总结表:
__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魔术方法的更多相关文章
- python类:magic魔术方法
http://blog.csdn.net/pipisorry/article/details/50708812 魔术方法是面向对象Python语言中的一切.它们是你可以自定义并添加"魔法&q ...
- (转)python类:magic魔术方法
原文:https://blog.csdn.net/pipisorry/article/details/50708812 版权声明:本文为博主皮皮http://blog.csdn.net/pipisor ...
- Python扩展之类的魔术方法
Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...
- PHP基础知识之魔术方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sle ...
- Python中的常用魔术方法介绍
1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 参数:至少有一个self,接收对象 返回值:无 作用:初始化对象的成员 注意:使用该方式初 ...
- Python基础数据类型以及对应方法
数据类型 不可变数据(四个):Number(数字).String(字符串).Tuple(元组).Sets(集合):可哈希 可变数据(两个):List(列表).Dictionary(字典).不可哈希 字 ...
- python基础-生成随机字符串方法
python解释器示例 >>> import uuid >>> uuid.uuid1() UUID('ae6822e6-c976-11e6-82e0-0090f5f ...
- Python学习笔记:魔术方法详解
准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...
- Python基础7:字符串方法
1 * 重复输出字符串 print('helo '*4) 2 [],[:] 通过索引获取字符串中的字符,这里和列表中的切片操作是相同的,具体内容见列表 print('hello word'[2:]) ...
随机推荐
- spoj 7258 SUBLEX(求第k大字串
其实对sam的拓扑排序我似懂非懂但是会用一点了. /** @xigua */ #include <stdio.h> #include <cmath> #include < ...
- python学习 day22 (3月29日)----(生成器推导式)
新手上路请多担待 1 2 封装 3 私有化封装 #__author : 'liuyang' #date : 2019/3/29 0029 上午 9:35 # 不想让别人看 修改 我的属性 # 源码来说 ...
- SHELL脚本取系统当前年月日问题 (去0)
1. #!/bin/bash tmonth=`date +%m`tyear=`date +%y`tday=`date +%d`day=`expr $tday + 0`month=`expr $tmon ...
- 数据分析报告格式zz
分析报告的输出是是你整个分析过程的成果,是评定一个产品.一个运营事件的定性结论,很可能是产品决策的参考依据,既然这么重要那当然要写好它了. 我认为一份好的分析报告,有以下一些要点: 首先,要有一个好的 ...
- swift -inout关键字
一般参数仅仅是在函数内可以改变的,当这个函数执行完后变量就会被销毁,不会有机会改变函数以外的变量,那么我们就会产生一个疑问,我们可不可以通过一个函数改变函数外面变量的值呢?答案是肯定的,这时我们就需要 ...
- 牛客训练:小a与黄金街道(欧拉函数+快速幂)
题目链接:传送门 思路:欧拉函数的性质:前n个数的欧拉函数之和为φ(n)*n/2,由此求出结果. 参考文章:传送门 #include<iostream> #include<cmath ...
- git 如何更改某个提交内容/如何把当前改动追加到某次commit上? git rebase
原文地址 http://www.jianshu.com/p/8d666830e826 [自己总结] 0, git diff git diff a b 是以a为基准,把b和a的区别展示出来 ...
- excel中vba将excel中数字和图表输出到word中
参考:https://wenku.baidu.com/view/6c60420ecc175527072208af.html 比如将选区变为图片保存到桌面: Sub 将选区转为图片存到桌面() Dim ...
- 避免使用eval()
eval()可以将任意的字符串当做一个JavaScript代码来执行. eval()使用实例: // 烦模式 var property = 'name'; console.log(eval('obj. ...
- JavaWeb多文件上传及zip打包下载
项目中经常会使用到文件上传及下载的功能.本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分. 首先明确一点: 无法通过页面的无刷新ajax请求,直接发下载.上 ...