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,即新式类才可以使用

 

 1 class SingleTon(object):
 2     instance = {}
 3     def __new__(cls, *args, **kwargs):
 4         if cls not in SingleTon.instance:
 5             SingleTon.instance[cls] =super(SingleTon,cls).__new__(cls,*args, **kwargs)
 6         return SingleTon.instance[cls]
 7     def __init__(self, *args, **kwargs):
 8         self.var1 = 1
 9     def __getattribute__(self,name):
10         print "variable %s is getted"%name
11         return super(SingleTon,self).__getattribute__(name)
12     def test(self):
13         print "test"
14 if __name__ == '__main__':
15     a = SingleTon()
16     a.var1
17     a.test()

 

结果:

variable var1 is getted
variable test is getted
test

 

5、__getattr__方法:

原型:__getattr__(self,name)

说明:当类对象调用的属性为找到则会调用这个方法,进行处理。

 1 class SingleTon(object):
 2     instance = {}
 3     def __new__(cls, *args, **kwargs):
 4         if cls not in SingleTon.instance:
 5             SingleTon.instance[cls] =super(SingleTon,cls).__new__(cls,*args, **kwargs)
 6         return SingleTon.instance[cls]
 7     def __init__(self, *args, **kwargs):
 8         self.var1 = 1
 9     def __getattr__(self,name):
10         print "not found %s"%name
11     def __getattribute__(self,name):
12         print "variable %s is getted"%name
13         return super(SingleTon,self).__getattribute__(name)
14     def test(self):
15         print "test"
16 if __name__ == '__main__':
17     a = SingleTon()
18     a.c

结果输出:

variable c is getted
not found c

由上面的例子可以看出__getattribute__魔法方法无论所调用属性方法存在与否都会去调用,而__getattr__方法只会在查找属性不存在的时候才会调用。同时需要注意__getattr__方法晚于__getattribute__方法执行。

6、__setattr__方法:

原型:__setattr__(self, name, value)

说明:对类属性进行赋值的时候,会先调用这个魔法方法,和__getattr__一样,俗称"拦截",可用于添加日志等。

 

 1 class SingleTon(object):
 2     instance = {}
 3     def __new__(cls, *args, **kwargs):
 4         if cls not in SingleTon.instance:
 5             SingleTon.instance[cls] =super(SingleTon,cls).__new__(cls,*args, **kwargs)
 6         return SingleTon.instance[cls]
 7     def __init__(self, *args, **kwargs):
 8         self.var1 = 1
 9     def __getattr__(self,name):
10         print "not found %s"%name
11     def __getattribute__(self,name):
12         print "variable %s is getted"%name
13         return super(SingleTon,self).__getattribute__(name)
14     def __setattr__(self,name, value):
15         print "variable %s is setted"%name
16         return super(SingleTon,self).__setattr__(name,value)
17 if __name__ == '__main__':
18     a = SingleTon()
19     a.c = 2

 

结果:

variable var1 is setted
variable c is setted

 注:经测试,python没有__setattribute__魔法方法,想想也没有必要,__setattr__足够了。

posted @ 2016-12-20 21:13  Esapinit  阅读(294)  评论(0编辑  收藏  举报