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:]) ...
随机推荐
- spring学习 六 spring与mybatis整合
在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...
- MongDB 配置成本地服务
一.配置mangodb. 首先现在下来直接安装就好了, 可视化工具可以后面再安装. 在自己安装的目录下面(这个随意做好能够放一块)建立一个data文件, 再在下面建立一个db文件 在cmd中进入到Mo ...
- 证明 U and V={0}时 dim(U+V)=dim(U)+dim(V)
U And V={0} 证明 dim(U+V)=dim(U)+dim(V)设{u1,u2,...,uk} 是U的基,{v1,v2...,vr}是V的基,dim(U)=k ,dim(V)=r dim(U ...
- 学习刘伟择优excel视频
for each 字符串函数: 默认参数,在子函数中必须要有默认值. 在工作表输入时,F9的功能是把区域编程数组,shift+ctrl+enter功能是把数组分开填入单元格. 创建数组: 1. 2. ...
- form表单序列化为json格式数据
在web开发过程中,经常遇到将form序列化不能格式的字符串提交到后台,下面就介绍怎样将form表单序列化为json字符串. 首先,是扩展的jquery序列化插件,依赖jquery.经测试,这段代码可 ...
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十之铭文升级版
铭文一级: 第八章:Spark Streaming进阶与案例实战 updateStateByKey算子需求:统计到目前为止累积出现的单词的个数(需要保持住以前的状态) java.lang.Illega ...
- LoadRunner改脚本
加action,不支持嵌套大括号 Action(){int iCt = 0; iCt = lr_output_message("abcdefg"); iCt = funA(3,5) ...
- Properties类、序列化流与反序列化流、打印流、commons-IO
Properties类 特点: 1.Hashtable的子类,map集合中的方法都可以用: 2.该集合没有泛型,键值都是字符串: 3.是一个可以持久化的属性集,键值可以存到集合中,也可存到持久化的设备 ...
- noip第1课资料
- Mac使用终端安装Homebrew(brew)
Homebrew简称brew,OSX上的软件包管理工具,在Mac终端可以通过brew安装.更新.卸载软件. 1.打开终端直接输入下面指令回车: // ruby -e "$(curl -fsS ...