python进阶(四)---需要了解的魔法方法

时间:2023-02-16 19:24:55

以下内容,源于个人理解所得,纯属臆测,爱信不信:-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. 【EasyUI】 日期格式化

    本文经过了测试,解决getFullyear() is not a function等问题 效果如下: 首先: Oracle中字段设置为DATE,MySQL中设置为DATETIME,MyBatis中会自 ...

  2. C#字符串(截取)

    1.按照逗号进行截取,并存放在一个数组中 eq:截取字符串,并放在数组中:string[] strArray = strPaths.Split(','); 获取某一个值 string s1=strAr ...

  3. Java 多线程同步的五种方法

    一.引言 闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常.举个例子 ...

  4. 最短路变形 poj3615&

    问题: 牛要跨过一些障碍,希望以最小的体力跨过障碍,并且对于一条路径,只在乎其中最高的障碍. 输入N代表站点数,标记为1—N,输入M代表路径数,从站点S到E之间需要跨过高度为H的障碍. 输入T代表牛要 ...

  5. Android工程师面试准备知识点

    听+7哥说,把下面的全弄懂,面试必过,所以我就试着去把所有题目补充了一下,各位能耐的网友们,如果有吐槽或者补充的尽管给我留言,在这里谢过大家了. 1.   android的多线程如何通信 答:Andr ...

  6. Vue(四)事件和属性

    1. 事件 1.1 事件简写 v-on:click="" 简写方式 @click="" <button v-on:click="show&quo ...

  7. 【Python】etree方法生成,解析xml

    #练习:另一种遍历xml文件的方式etree,xpathimport systry: import xml.etree.cElementTree as ET #前面带c的都是比较快的,效率高且不占内存 ...

  8. mac连接Windows远程桌面

    先打开微软官方的下载面面:http://www.microsoft.com/zh-CN/download/details.aspx?id=18140 下载远程连接客户端 http://jingyan. ...

  9. CANVAS实现调色板 之 我的第一个随笔

    主题代码 <canvas id="color"></canvas> <script> var color=document.getElement ...

  10. MFC ADO数据库操作

    MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/ 内容比较乱,作为草稿,对现 ...