English 中文(简体)
粉碎所有子级方法,并提供战胜手段
原标题:Python Decorate all methods of subclass, and provide means to override

我正在努力找到一种办法,减少碎块的腐蚀器。 我们拥有许多使用“@decorate”的课程。 例如:

class MyClass(Base):
     @decorate
     def fun1(self):
         pass
     @decorate
     def fun2(self):
         pass
     def fun3(self):
         pass

除非有人另有说明,否则,我希望以缺席的方式作出纠正。


我使用该法典做汽车修理。

from functools import wraps

def myDecorator(func):
    @wraps(func)
    def decorator(self, *args, **kwargs):
        try:
            print  enter 
            ret = func(self, *args, **kwargs)
            print  leave 
        except:
            print  exception 
            ret = None

        return ret

    return decorator

class TestDecorateAllMeta(type):
    def __new__(cls, name, bases, local):
        for attr in local:
            value = local[attr]
            if callable(value):
                local[attr] = myDecorator(value)
        return type.__new__(cls, name, bases, local)

class TestClass(object):
    __metaclass__ = TestDecorateAllMeta

    def test_print2(self, val):
        print val

    def test_print(self, val):
        print val

c = TestClass()
c.test_print1("print 1")
c.test_print2("print 2")

我的问题是:

  1. Is there a better way to accompish auto-decorating?
  2. How can I go about overriding?

理想的做法是,我的最终解决办法是:

class TestClass(object):
    __metaclass__ = TestDecorateAllMeta

    def autowrap(self):
        print("Auto wrap")

    @dont_decorate
    def test_dont_decorate(self, val):
        print val

<><>Edit>/strong>

谈到以下评论之一,因为课程是可调用的,而不必这样做。

if callable(value):

改为:

if isinstance(value,types.FunctionType) 
最佳回答

不是使我的班级用户具体说明_metaclass__。 属性 我只想从我界定的基类中得出这些结论。 无需不必要地暴露pl。

但除此之外,情况良好。 您的“密码>@dont_decorate功能 decorator可以通过就原有功能确定一个特性来加以执行,如果存在这种特性,则由您的职等校正员负责发现和ski。

def dont_decorate(func):
    func._dont_decorate = True
    return func

然后,在您的会堂上,你现在有<编码>可打电话(价值):

if callable(value) and not hasttr(value, "_dont_decorate"):

除此以外,等值为可打电话<>>,因此,如果您不希望内部班级加以校正,你可能应当使用<条码>(<>sinstance(>)而不是<条码>可调用(<><>>>>>>)。

如果你对更明确的备选办法感兴趣,你可以查询。 不幸的是,这很复杂,因为理赔员在看到这些方法时已经总结这些方法。

问题回答

暂无回答




相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...