如何用装饰方法派生类?

时间:2013-06-26 20:53:09

标签: python oop jinja2 cherrypy

我有几个类似的python cherrypy应用程序

application_one.py

import cherrypy

class Class(object):

    @cherrypy.tools.jinja(a='a', b='b')
    @cherrypy.expose
    def index(self):
        return {
            'c': 'c'
        }

application_two.py

import cherrypy

class Class(object):

    @cherrypy.tools.jinja(a='a2', b='b2')
    @cherrypy.expose
    def index(self):
        return {
            'c': 'c2'
        } 

...

application_n.py

import cherrypy

class Class(object):

    @cherrypy.tools.jinja(a='aN', b='bN')
    @cherrypy.expose
    def index(self):
        return {
            'c': 'cN'
        }

我想创建父类并在所有应用程序中派生它。 像这样的东西

parent.py

import cherrypy

class ParentClass(object):

    _a = None
    _b = None
    _c = None

    @cherrypy.tools.jinja(a=self._a, b=self._b)
    @cherrypy.expose
    def index(self):
        return {
            'c': self._c
        }

application_one.py

import parent

class Class(ParentClass):

    _a = 'a'
    _b = 'b'
    _c = 'c'

application_two.py

import parent

class Class(ParentClass):

    _a = 'a2'
    _b = 'b2'
    _c = 'c2'

如何从派生类发送索引方法装饰器的参数?

现在我收到错误

  

NameError:name' self'未定义

1 个答案:

答案 0 :(得分:2)

当您定义类时,将应用装饰器。定义类时,您没有运行方法,因此未定义selfself没有引用的实例。

您必须使用元类,在构建子类时添加装饰器,或者您必须使用类装饰器,在类定义后应用右装饰器。

类装饰器可以是:

def add_decorated_index(cls):
    @cherrypy.tools.jinja(a=cls._a, b=cls._b)
    @cherrypy.expose
    def index(self):
        return {
            'c': self._c
        }

    cls.index = index
    return cls

然后将其应用于子类:

import parent

@parent.add_decorated_index
class Class(parent.ParentClass):
    _a = 'a'
    _b = 'b'
    _c = 'c'