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

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

概述如果这个问题已经在某个地方得到解答,我很抱歉,但如果有的话,我无法找到答案. 我想创建一个父类的子类,使得在每次调用相应的父类方法之前会有一个延迟(例如time.sleep()).我想以这样的方式执行此 *** 作,即我不需要复制子类中的每个父类方法.实际上,我希望有一个几乎可以用于任何父类的泛型方法 – 这样我甚至不需要知道所有的父类方法. 在实例化子类时将指定延迟. 例如: class Parent( 如果这个问题已经在某个地方得到解答,我很抱歉,但如果有的话,我无法找到答案.

我想创建一个父类的子类,使得在每次调用相应的父类方法之前会有一个延迟(例如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 pythonfrom types import FunctionTypeimport timedef 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,newClassDict)    return MetaClassdef delayed(func):    def wrapped(*args,**kwargs):        time.sleep(2)        func(*args,**kwargs)    return wrappedDelayed = MetaClassFactory(delayed)class MyClass(object):    __Metaclass__ = Delayed     def a(self):        print 'foo'    def b(self):        print 'bar'

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

总结

以上是内存溢出为你收集整理的当我不想复制父类中的每个方法时,如何为Python子类中的每个方法添加延迟全部内容,希望文章能够帮你解决当我不想复制父类中的每个方法时,如何为Python子类中的每个方法添加延迟所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1194576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存