加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:19:17 所属栏目:Python 来源:网络整理
导读:如果这个问题已经在某个地方得到解答,我很抱歉,但如果有的话,我无法找到答案. 我想创建一个父类的子类,使得在每次调用相应的父类方法之前会有一个延迟(例如time.sleep()).我想以这样的方式执行此操作,即我不需要复制子类中的每个父类方法.实际上,我希望有一
如果这个问题已经在某个地方得到解答,我很抱歉,但如果有的话,我无法找到答案.

我想创建一个父类的子类,使得在每次调用相应的父类方法之前会有一个延迟(例如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,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中检查该名称并忽略它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读