`

Python装饰器和__call__函数

 
阅读更多

__call__

在python中,函数其实是一个可调用的对象,实例对象可以用函数的形式表示

一个类实例可以变成一个可调用的对象,只需要实现方法__call__()

 

一、把类Myclass变成可调用的对象:

 

class Myclass(object):
    
    def __init__(self, fn):
        self.name = fn
        print fn
        
    def __call__(self, *args, **kwargs):
        print "My name is ..."
        self.name(*args, **kwargs)
        print "My friend is ..."

def getInfo(test):
    print test

cls = Myclass(getInfo)
cls('Tim')

打印:
<function myfun at 0x1005ed2a8>
<function getInfo at 0x1005e0ed8>
My name is ...
Tim
My friend is ...

 

 

二、把实例对象用类似于函数的形式表示,

 

class Test():
    def __init__(self):
        pass
    
    def __call__(self, num):
        sum = 0
        for i in range (num):
            sum += i
        return sum

t = Test()
print t(10)
打印:
45

 

 

Python装饰器:使用类来定义装饰器(Python中类实例可以当做函数一样调用)

 

class Myclass(object):
    
    def __init__(self, fn):
        self.name = fn
        print fn
        
    def __call__(self, *args, **kwargs):
        print "My name is ..."
        self.name(*args, **kwargs)
        print "My friend is ..."

def getInfo(ni):
    print ni

@Myclass
def myfun(name, gender):
    print "start..."
    print name
    print gender
    print "end..."

myfun('Bob', 'male')
打印:
<function myfun at 0x1005ee2a8>
My name is ...
start...
Bob
male
end...
My friend is ...

 小编只是举个例子。小编在实际项目中的调用场景是:

一、计算一个网页的pv流量

二、控制某些网页的访问,例如必须登录才能访问

三、在某些函数的前后打印必要的日志信息

综上:都是为了简化函数的一些流程,将统一的代码规范化,避免函数一些共性的代码重复书写

 

 

分享到:
评论

相关推荐

    浅谈python中的__init__、__new__和__call__方法

    这个方法可以用来实现一些特殊的行为,比如回调或者装饰器模式。例如: ```python class MyCallable: def __call__(self, *args, **kwargs): print(f"Called with args {args} and kwargs {kwargs}") my_obj = ...

    对python特殊函数 __call__()的使用详解

    1. **装饰器**:可以利用 `__call__()` 实现更加灵活的装饰器。通过定义一个类并在其中实现 `__call__()` 方法,可以创建出能够根据运行时条件动态改变行为的装饰器。 ```python class LoggingDecorator: def __...

    Python装饰器模式学习demo

    Python装饰器是一种高级编程技巧,它允许我们修改或增强函数、方法或类的行为,而无需对原始代码进行任何更改。装饰器本质上是一个接收一个函数作为输入并返回一个新的函数的函数。这种设计模式在Python中非常常见,...

    装饰器decorator_python_

    装饰器在Python编程中是一种强大的工具,它允许我们在不修改原始函数代码的前提下,为函数添加新的功能或行为。装饰器本质上是Python中的一个函数,它接收一个函数作为参数,并返回一个新的函数。这种设计模式在很多...

    python装饰器的4中类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类

    Python装饰器是编程中一种强大的工具,用于在不修改源代码的情况下增强或修改函数、类的行为。装饰器的本质是函数,它可以接收一个函数作为参数,并返回一个新的函数。下面将详细介绍Python装饰器的四种类型:函数...

    python中__call__内置函数用法实例

    3. **装饰器**:利用`__call__`方法可以轻松地实现类装饰器,这对于需要在运行时动态修改功能的情况非常有用。 ```python class MyDecorator: def __init__(self, func): self.func = func def __call__...

    Python __setattr__、 __getattr__、 __delattr__、__call__用法示例

    而`__call__`则常用于装饰器、工厂模式,或者创建类似函数的对象。 总的来说,理解和灵活运用这些魔法方法可以极大地增强Python对象的灵活性和可定制性,使代码更加优雅和高效。在设计类和对象时,合理利用这些方法...

    python 装饰器(示例)

    Python装饰器是编程语言中的一个强大工具,它允许我们在不修改源代码的情况下,扩展或修改函数、类甚至模块的行为。装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,...

    带你了解python装饰器

    ### Python装饰器详解 #### 一、装饰器概念与作用 在Python中,装饰器是一种特殊类型的函数,它可以接收一个函数作为输入,并返回一个新的函数。装饰器的主要目的是增强或修改函数的功能,而无需更改原函数的代码...

    python——retry装饰器(csdn)————程序.pdf

    retry 装饰器是指在 Python 中,使用装饰器(decorator)实现函数的重试机制。其主要思想是,在函数执行过程中,如果出现异常,retry 装饰器将捕捉到该异常,并根据设置的重试次数,重新执行该函数,直到函数执行...

    Python中的各种装饰器详解

    - 除了函数式装饰器,Python还支持类装饰器,即装饰器可以是一个类,该类的实例必须有`__call__`方法,使得类实例可像函数一样被调用。 - 类装饰器通常用于封装更复杂的状态或行为,比如跟踪函数调用次数,记录...

    python-装饰器Decorators.pdf

    ### Python装饰器详解 #### 一、什么是装饰器? 装饰器是Python中一个非常重要的特性。简单来说,装饰器就是一个可以修改其他函数功能的函数。它们可以帮助我们编写更加简洁、可读性更强的代码,同时也使得代码...

    python 中的-call-方法.docx

    在Python中,“call”一词通常与函数调用和特殊方法__call__相关联。以下是对这两个方面的详细介绍: 一、函数调用 定义: 函数是Python中可重用的代码块,用于执行特定任务。 函数通过def关键字定义,包括函数名、...

    python类装饰器装饰方法通用编码模型分析.zip

    Python 类装饰器是一种强大的工具,它允许我们修改或增强函数、方法或类的行为,而无需直接改动它们的源代码。装饰器本质上是 Python 函数,它们可以接收一个可调用对象(函数或方法)作为参数,并返回一个新的可调...

    Python:Python高级特性:装饰器与迭代器

    在Python中,一个函数可以被多个装饰器修饰,装饰器的执行顺序遵循从上到下的原则,但在实际调用时则遵循从下到上的顺序。 ```python def log_decorator(func): def wrapper(*args, **kwargs): print(f"调用函数 ...

    python 装饰模式(示例)

    总结来说,Python的装饰模式(即装饰器)是一种强大的工具,它可以优雅地扩展和修改函数或类的行为,而不必改动它们的源代码。这种模式在实际编程中非常实用,尤其是在需要灵活扩展功能而又要保持代码整洁的情况下。...

    python类装饰器装饰方法通用编码模型分析.pdf

    类装饰器通常通过重写类的一些特殊方法来实现装饰功能,例如__call__方法可以让类的实例像函数一样被调用,__get__方法则与属性查找和绑定有关。 装饰器的用途非常广泛,常见的应用场景包括但不限于:注册功能(对...

    python装饰器相当于函数的调用方式

    Python装饰器是Python语言中的一种高级特性,它允许我们在不修改原有函数代码的情况下,增加或扩展函数的功能。装饰器本质上是一个Python函数,它可以让其他函数或类在不需要做任何代码变动的前提下增加额外功能,...

Global site tag (gtag.js) - Google Analytics