2

我有几个类似的 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'
        } 

……

应用程序_n.py

import cherrypy

class Class(object):

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

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

父.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:名称“自我”未定义

4

1 回答 1

2

定义类时应用装饰器。定义类时,您没有运行方法,因此self没有定义。没有实例self可以参考。

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

类装饰器可以是:

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'
于 2013-06-26T21:31:24.177 回答