以下内容,源于个人理解所得,纯属臆测,爱信不信:-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. cocos2dx 3.x(获得父类的node型指针调用父类函数this->getParent())

    void CenterLayer::zhanzheng(CCObject* pSender){ ((GameScene*)this->getParent())->showLayer(Gam ...

  2. 使用mybatis-generator自动生成映射配置

    使用mybatis时,编写实体类与数据库的映射是一项繁琐的工作,很容易出错,而mybatis-generator工具很好地解决了这个问题. 一.工具下载与配置  下载地址:① https://gith ...

  3. Ubuntu Dev Box Setup

    Editor VIM Sublime Atom Visual Studio Code SSH Client PAC Manager File Manager Double Commander Imag ...

  4. 使用Microsoft Fakes隔离测试代码

    在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...

  5. DataAnnotations里DisplayAttribute和 ValidationAttribute 如何从资源文件读取信息,显示多语言

    这个是我们常见的AccountModel代码 public class ChangePasswordModel { [Required] [DataType(DataType.Password)] [ ...

  6. AjaxStudyNote

    AjaxStudyNoteBy:Silvers:(E:\Video_Tutorials\Java自学视频\尚硅谷JavaEE培训\6WEB基础-Ajax)15:02 2016/2/29什么是AjaxA ...

  7. 2.MongoDB数据库简介

    1).简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...

  8. JVM内存结构---《深入理解Java虚拟机》学习总结

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域的用途各不相同,同时也依据着各自的执行规则,独立的创建和销毁数据. 虚拟机内存的划分,如图所示: 线程之间 ...

  9. 论文阅读(Xiang Bai——【CVPR2012】Detecting Texts of Arbitrary Orientations in Natural Images)

    Xiang Bai--[CVPR2012]Detecting Texts of Arbitrary Orientations in Natural Images 目录 作者和相关链接 方法概括 方法细 ...

  10. Coursera台大机器学习课程笔记5 -- Theory of Generalization

    本章思路: 根据之前的总结,如果M很大,那么无论假设泛化能力差的概率多小,都无法忽略,所以问题转化为证明M不大,然后上章将其转化为证明成长函数:mh(N)为多项式级别.直接证明似乎很困难,本章继续利用 ...