На самом деле, не должно быть проблем с размещением их всех внутри класса. Находясь внутри тела класса, вы можете назвать любую переменную, определенную до сих пор, просто назвав ее:
class A(object):
a = 1
b = 2
c = a + b
print A.c
Это дает результат 3, потому что, пока Python выполняет тело класса, функции могут «видеть» объявленные переменные a и b. Таким образом, следующее также работает:
class B(object):
@staticmethod
def wrapper(*args, **kw):
...
@wrapper
def a(...):
...
А как насчет функции слияния? Проблема заключается в том, что функция-обертка запускается долго после , когда тело класса выполняется, а переменные, которые она определила, больше не находятся в области видимости. Как вы можете ссылаться на них, тогда? Используя имя класса в качестве префикса! Как это:
class C(object):
@staticmethod
def wrap1(*args, **kw):
...
@staticmethod
def wrap2(*args, **kw):
...
@staticmethod
def wrap3(*args, **kw):
...
@staticmethod
def merger(*args, **kw):
C.wrap1(C.wrap2(C.wrap3(...)))
@merger
def plain(...):
...
Итак, общее правило для Python: код, который выполняется прямо на уровне тела класса, может говорить обо всех переменных и методах, которые были определены внутри него, и это означает, что вы можете использовать эти переменные класса как оберток. Но как только вы окажетесь «внутри» функции в классе, будь то функция класса, статическая функция или метод (и эта обертка является методом класса, поскольку она принимает аргументы, но не «self»), вам придется использовать имя класса, чтобы "получить" его содержимое.