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) ...
随机推荐
- int型时间字符串转日期
string re ="201611"; DateTime d1 = DateTime.ParseExact(re, "yyyyMMdd", null);
- duilib各种布局的作用,相对布局与绝对布局的的意义与用法
大多数刚使用duilib的朋友时候非常依赖duilib自带的设计器,用他可以拖拉控件,可视化的做出自己想要的界面.可是用一段时间就会发现原带的设计器有很多bug,时不时会崩溃,支持的控件数量有限,属性 ...
- APP开发:对于IOS APP应用的推广渠道有哪些?
亿合科技了解到,随着移动互联网时代的到来,苹果从2007年进入中国市场,一直备受大众喜爱,手机应用也层出不穷.那么对于那么多的IOS APP应用怎么能获得用户的喜爱呢?于是推广APP应用是需要做的,亿 ...
- poj 3190 Stall Reservations
http://poj.org/problem?id=3190 Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Su ...
- 纪勇破解QQ号问题
试题描述 来到了新学校,才相处不到一个月,jy就对oyjy一见钟情.于是向oyjy问QQ号.当然身为创(实)新(验)一班的同学,oyjy还是要考考jy.她给了纪勇一个加密后的QQ号,让纪勇解密,解密规 ...
- C#先序遍历2叉树(非递归)
找了下先序遍历二叉树C# 实现貌似没有 顺手些了一个 大致思路是: 传入根节点,然后依次循环其子节点推入到栈中, 当推入的节点没有子节点的时候(叶子)或者所有子节点均已经遍历过后(上一次遍历的节点是该 ...
- windows下利用virtual 安装 flask
出处: https://segmentfault.com/a/1190000002450878 本文介绍Windows下如何从零开始搭建Python + Flask开发环境. 安装Python 2.7 ...
- js获取元素样式
http://blog.sina.com.cn/s/blog_89cd68470101i108.html
- 简单而又复杂的jsp(小知识)
JSP中的page标签中的pageEncoding属性和contentType属性 pageEncoding的默认值为ISO-8859-1 contentType的默认属性为:text/html; c ...
- Ruby中 Include, Extend, Import, Require 的使用区别
Include 如下例当你Include一个模块到某个类时, 相当于把模块中定义的方法插入到类中.它允许使用 mixin.它用来 DRY 你的代码, 避免重复.例如, 当你有多个类时, 需要相同的函数 ...