python进阶(四)---需要了解的魔法方法
以下内容,源于个人理解所得,纯属臆测,爱信不信:-D。欢迎大家留言讨论指正。
1、__new__魔法方法:
原型:__new__(cls, *args, **kwargs)
说明:__new__魔法方法用于对象的实例化,作用于__init__初始化对象之前。其中cls为需要实例化的类。new方法必须有返回值,即为实例化后的对象。可以被用于创建单例模式,限制该类实例化的对象个数。
class SingleTon(object):
instance = {}
def __new__(cls, *args, **kwargs):
if cls not in SingleTon.instance:
SingleTon.instance[cls] =super(SingleTon,cls).__new__(cls,*args, **kwargs)
return SingleTon.instance[cls]
def __init__(self, *args, **kwargs):
pass if __name__ == '__main__':
a = SingleTon()
b = SingleTon()
if a is b :
print "SingleTon"
else:
print "not SingleTon"
结果输出:SingleTon
2、__doc__属性:
用于查看类或方法的文档
3、__dict__属性:
以字典的形式呈现类或类实例所有的属性
class SingleTon(object):
instance = {}
def __new__(cls, *args, **kwargs):
if cls not in SingleTon.instance:
SingleTon.instance[cls] =super(SingleTon,cls).__new__(cls,*args, **kwargs)
return SingleTon.instance[cls]
def __init__(self, *args, **kwargs):
self.var1 = 1
def test(self):
print "tee" if __name__ == '__main__':
a = SingleTon()
b = SingleTon()
a.var2 = 2
print a.__dict__
print b.__dict__
结果为:
{'var1': 1, 'var2': 2}
{'var1': 1, 'var2': 2}
4、__getattribute__方法
原型:__getattribute__(self, name)
说明:当name代表的属性或方法被访问时,会先执行这个方法。同时注意这个方法需要类继承自object,即新式类才可以使用。
class SingleTon(object):
instance = {}
def __new__(cls, *args, **kwargs):
if cls not in SingleTon.instance:
SingleTon.instance[cls] =super(SingleTon,cls).__new__(cls,*args, **kwargs)
return SingleTon.instance[cls]
def __init__(self, *args, **kwargs):
self.var1 = 1
def __getattribute__(self,name):
print "variable %s is getted"%name
return super(SingleTon,self).__getattribute__(name)
def test(self):
print "test"
if __name__ == '__main__':
a = SingleTon()
a.var1
a.test()
结果:
variable var1 is getted
variable test is getted
test
5、__getattr__方法:
原型:__getattr__(self,name)
说明:当类对象调用的属性为找到则会调用这个方法,进行处理。
class SingleTon(object):
instance = {}
def __new__(cls, *args, **kwargs):
if cls not in SingleTon.instance:
SingleTon.instance[cls] =super(SingleTon,cls).__new__(cls,*args, **kwargs)
return SingleTon.instance[cls]
def __init__(self, *args, **kwargs):
self.var1 = 1
def __getattr__(self,name):
print "not found %s"%name
def __getattribute__(self,name):
print "variable %s is getted"%name
return super(SingleTon,self).__getattribute__(name)
def test(self):
print "test"
if __name__ == '__main__':
a = SingleTon()
a.c
结果输出:
variable c is getted
not found c
由上面的例子可以看出__getattribute__魔法方法无论所调用属性方法存在与否都会去调用,而__getattr__方法只会在查找属性不存在的时候才会调用。同时需要注意__getattr__方法晚于__getattribute__方法执行。
6、__setattr__方法:
原型:__setattr__(self, name, value)
说明:对类属性进行赋值的时候,会先调用这个魔法方法,和__getattr__一样,俗称"拦截",可用于添加日志等。
class SingleTon(object):
instance = {}
def __new__(cls, *args, **kwargs):
if cls not in SingleTon.instance:
SingleTon.instance[cls] =super(SingleTon,cls).__new__(cls,*args, **kwargs)
return SingleTon.instance[cls]
def __init__(self, *args, **kwargs):
self.var1 = 1
def __getattr__(self,name):
print "not found %s"%name
def __getattribute__(self,name):
print "variable %s is getted"%name
return super(SingleTon,self).__getattribute__(name)
def __setattr__(self,name, value):
print "variable %s is setted"%name
return super(SingleTon,self).__setattr__(name,value)
if __name__ == '__main__':
a = SingleTon()
a.c = 2
结果:
variable var1 is setted
variable c is setted
注:经测试,python没有__setattribute__魔法方法,想想也没有必要,__setattr__足够了。
python进阶(四)---需要了解的魔法方法的更多相关文章
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- python中的魔术属性与魔法方法
1.魔法属性 · 1.1__doc__魔法属性 表示类的描述信息 class Fo: """ 这是今天第一个魔术属性__doc__""" ...
- 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...
- python中几个常见的魔法方法
首先,什么是魔法方法呢?在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做"魔法"方法. __ init__()方法 当一个实例被创建的时候调用的初始 ...
- Python笔记(二十六)_魔法方法_属性的魔法方法
属性的魔法方法 __getattribute__(self,name):当该类的属性被访问时,自动触发,是最先被触发的属性方法 __setattr__(self,name,value):当一个属性被设 ...
- Python学习笔记(七)——魔法方法
1.构造和析造 魔法方法就是被双下划线包围的方法 __init__()方法 __init__方法默认没有参数,返回值为none.类实例化对象需有明确的初始化步骤要重写函数 >>> c ...
- Python笔记(二十八)_魔法方法_迭代器
迭代器用于遍历容器中的数据,但它不是容器,它是一个实现了__next__方法的对象 与迭代器相关的内置函数: iter(): 将一个对象转换成一个迭代器 next(): 访问迭代器中的下一个变量,直到 ...
- python语法学习第十天--魔法方法
魔法方法二!!! 属性访问:在对属性任何操作时,都会调用 有关属性 __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为 __getattribute__(s ...
- Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法
类的内置方法 它与内置函数有紧密的联系,有的内置函数就是调用的内置方法. 在顶级父类obj中有: 两个双下方法 obj.__str__ str(obj) obj.__repr__ repr(obj) ...
随机推荐
- python 调用封装好的模块
有些时候,我们写了些通用的模块,想调用的时候,该怎么操作呢? 以下是我写的一个简单的登录作为例子: 在cla.py中定义了一个Login_gues.pyt(带参数的实例):在cc.py下调用这个; 1 ...
- express 的 app.get和app.use
1.若调用app.get()时只有一个参数,则认为是取设置值,否则认为是注册路由 2.所有被 app.use() 接收的 handle 会被放到一个 stack 里边 app.get() 执行的时候会 ...
- git pull 冲突解决
这个意思是说更新下来的内容和本地修改的内容有冲突,先提交你的改变或者先将本地修改暂时存储起来. 处理的方式非常简单,主要是使用git stash命令进行处理,分成以下几个步骤进行处理. 1.先将本地修 ...
- linux-----------linux查看并发数
1.查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a ...
- Access restriction: The type QName is not accessible due to restriction on required library
There's another solution that also works. I found it on this forum: Go to the Build Path settings in ...
- 列表边框column-rule
column-rule主要是用来定义列与列之间的边框宽度.边框样式和边框颜色.简单点说,就有点类似于常用的border属性.但column-rule是不占用任何空间位置的,在列与列之间改变其宽度不会改 ...
- eclipse安装svn
- react.js语法为了更好的兼容可以选以下这种方法配置即可
首先下一个sublime text3 的编辑器: 支持大家使用正版,不过我是为了方便才所以这版本而已... 地址: http://sublimetext.iaixue.com/forum.php?mo ...
- 谈谈我印象中的JVM不足之处
研究JVM也有一段时间了,其间也发现了它的很多不足之处,在此一一道来,由于本人对JVM的理解有限,如有错误的地方,还请大家指正:本文不介绍名词性术语和概念性知识,如有不了解的地方可Search Goo ...
- JavaScript中const、var和let区别浅析
在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...