以下内容,源于个人理解所得,纯属臆测,爱信不信:-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进阶(四)---需要了解的魔法方法的更多相关文章

  1. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  2. python中的魔术属性与魔法方法

    1.魔法属性 · 1.1__doc__魔法属性  表示类的描述信息 class Fo: """ 这是今天第一个魔术属性__doc__""" ...

  3. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)

    面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...

  4. python中几个常见的魔法方法

    首先,什么是魔法方法呢?在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做"魔法"方法. __ init__()方法 当一个实例被创建的时候调用的初始 ...

  5. Python笔记(二十六)_魔法方法_属性的魔法方法

    属性的魔法方法 __getattribute__(self,name):当该类的属性被访问时,自动触发,是最先被触发的属性方法 __setattr__(self,name,value):当一个属性被设 ...

  6. Python学习笔记(七)——魔法方法

    1.构造和析造 魔法方法就是被双下划线包围的方法 __init__()方法 __init__方法默认没有参数,返回值为none.类实例化对象需有明确的初始化步骤要重写函数 >>> c ...

  7. Python笔记(二十八)_魔法方法_迭代器

    迭代器用于遍历容器中的数据,但它不是容器,它是一个实现了__next__方法的对象 与迭代器相关的内置函数: iter(): 将一个对象转换成一个迭代器 next(): 访问迭代器中的下一个变量,直到 ...

  8. python语法学习第十天--魔法方法

    魔法方法二!!! 属性访问:在对属性任何操作时,都会调用   有关属性 __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为 __getattribute__(s ...

  9. Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法

    类的内置方法 它与内置函数有紧密的联系,有的内置函数就是调用的内置方法. 在顶级父类obj中有: 两个双下方法 obj.__str__ str(obj) obj.__repr__ repr(obj) ...

随机推荐

  1. Ubuntu16.04安装vim插件YouCompleteMe

    原文 1 下载 git clone --recursive git://github.com/Valloric/YouCompleteMe 如果执行该命令没报错, 就ok了. 但是中途有可能会断掉, ...

  2. 探索性思维——How to Solve It

    我觉得这篇文章和什么都能扯上点关系,比如编程. 很多人已经讨论过数学与编程的关系了,这里不想过多探讨,只是简单提一下:有些人把数学贬低地一文不值,认为做一般的应用软件用不到数学:而有些人则把数学拔高到 ...

  3. springmvc中的controller是单例的

    今天发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变 ...

  4. 非常简单的数据,支持excel表格下载功能

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  5. Docker相关文档

    网上找到的一个入门级Docker学习笔记,写的不错,值得一看. 转自:http://www.open-open.com/lib/view/open1423703640748.html#articleH ...

  6. 夺命雷公狗-----React---27--小案例之react经典案例todos(清除已完成)

    这个功能其实也是很简单的,就只是让todos里面的内isDown进行取反即可 然后在Zong里面进行下修改即可 效果如下所示: 代码如下所示: <!DOCTYPE html> <ht ...

  7. 【KeyCode 键码】

    Key codes returned by Event.keyCode. These map directly to a physical key on the keyboard. KeyCode是由 ...

  8. QuickRun-快速运行助手

    大家平时需要打开软件的时候都是怎么操作的?一般来说有三种方式: 切换到桌面再点击软件的快捷方式(会将当前正在操作的软件隐藏,再切换回之前的状态比较麻烦,特别是桌面被密密麻麻的图标铺满的时候,找到一个快 ...

  9. .net之工作流工程展示及代码分享(一)工作流表单

    Workflow表单的作用是能够在客户端进行表单设计,然后在流程中动态开放哪些输入框可以供用户填写. 在这里我扩展了一个常用的WebEditor工具——KindEditor,能够插入自定义的html符 ...

  10. python 学习(json)(转)

    Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用于h ...