ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

当我不想复制父类中的每个方法时,如何为Python子类中的每个方法添加延迟

2019-07-15 18:55:43  阅读:166  来源: 互联网

标签:python methods dynamic


如果这个问题已经在某个地方得到解答,我很抱歉,但如果有的话,我无法找到答案.

我想创建一个父类的子类,使得在每次调用相应的父类方法之前会有一个延迟(例如time.sleep()).我想以这样的方式执行此操作,即我不需要复制子类中的每个父类方法.实际上,我希望有一个几乎可以用于任何父类的泛型方法 – 这样我甚至不需要知道所有的父类方法.

在实例化子类时将指定延迟.

例如:

class Parent():
    ....
    def method1(self):
        ....
    def method2(self):
        ....


class Child(Parent):
    def __init__(self, delay)
        self.delay = delay
        ....

child = Child(1)

对child.method1()的调用将导致在调用Parent.method1()之前延迟1秒.

解决方法:

我认为之前给出的答案并没有真正解决您从父类延迟所有方法的特定需求,而不一定要去装饰它们.你说你不想在子类中复制父类方法,以便你可以延迟它们.这个答案使用来自S.Lott的相同延迟包装器,但也使用元类(http://www.voidspace.org.uk/python/articles/metaclasses.shtml)

#!/usr/bin/env python

from types import FunctionType
import time


def MetaClassFactory(function):
    class MetaClass(type):
        def __new__(meta, classname, bases, classDict):
            newClassDict = {}
            for attributeName, attribute in classDict.items():
                if type(attribute) == FunctionType:
                    attribute = function(attribute)

                newClassDict[attributeName] = attribute
            return type.__new__(meta, classname, bases, newClassDict)
    return MetaClass


def delayed(func):
    def wrapped(*args, **kwargs):
        time.sleep(2)
        func(*args, **kwargs)
    return wrapped

Delayed = MetaClassFactory(delayed)

class MyClass(object):
    __metaclass__ = Delayed 

    def a(self):
        print 'foo'

    def b(self):
        print 'bar'

MetaClassFactory包装延迟装饰器中的每个函数.如果你想确保某些内置函数(如init函数)没有延迟,你可以在MetaClassFactory中检查该名称并忽略它.

标签:python,methods,dynamic
来源: https://codeday.me/bug/20190715/1470477.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有