python特殊函数 __call__

原创 ryan007  2017-07-18 00:14  阅读 182 次

在Python里面,我们知道一切都是对象,对象通过提供__call__(slef, [,*args [,**kwargs]])方法可以模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2...) 等同于调用x.__call__(self, arg1, arg2) 。

模拟函数的对象可以用于创建防函数(functor) 或代理(proxy)

 

class Distance(object):

    def __init__(self, start):

        self.start = start

        print("start point :"+str(start))

    def __call__(self, x):

        print "x :"+str(x)



p = Distance(1000)

p(200)

 

输出

>>>

origin :1000

x :200

 

 

为了弄明白python中__setattr__, __getattr__, __delattr__, __call__的作用,重写dict,扩展其功能

 

class Stone(dict):
   #通过使用__setattr__, __getattr__, __delattr__
   #可以重写dict,使之通过“.”调用
   def __setattr__(self, key, value):
       self[key] = value
   def __getattr__ (self, key):
       try:
           return self[key]
       except KeyError, k:
           return None
   def __delattr__ (self, key):
       try:
           del self[key]
       except KeyError, k:
           return None

   # __call__方法用于实例自身的调用
   #达到()调用的效果
   def __call__ (self, key):
       try:
           return self[key]
       except KeyError, k:
           return None

s = Stone()
s.title = "hello"#这是__setattr__起的作用
print s("title")#这是__call__起的作用
print s["title"]#dict默认行为
print s.title#这是__getattr__起的作用
del s.title#这是__delattr__起的作用
print s("title")
print s["title"]
print s.title

我们在这里感受到Python里面的__setattr__,__call__,__getattr__, __delattr__的魅力,在以后工作中可以使用这样特性方便我们的工作。

 

 

本文地址:http://it.zhongduwang.com/articles/python-special-function-call
版权声明:本文为原创文章,版权归 ryan007 所有,欢迎分享本文,转载请保留出处!

发表评论


表情