Я все еще новичок в python с опытом работы менее года, и я изучил его, создав довольно большой проект на движке приложений Google.Он превратился в чудовище из 10 000+ строк кода и HTML-шаблонов, поэтому я нахожусь в процессе рефакторинга довольно большой части кода, чтобы следовать гораздо более строгой архитектуре MVC.
Мой вопрос касается непосредственно Python.Я не знаю слов, чтобы точно сказать, что я хочу построить, поэтому я просто хотел бы использовать пример.
Это мой текущий «базовый» код для отображения представления:
class MainHandler(webapp.RequestHandler):
def get(self):
tUser = users.get_current_user()
tContext = {
'user': tUser,
'login': users.create_login_url(self.request.uri),
'logout': users.create_logout_url(self.request.uri),
}
#User is logged in
if (tUser):
#code for loading view information and adding to the context dict
#CUSTOMIZATION GOES HERE
else:
self.redirect("/")
tmpl = os.path.join(os.path.dirname(__file__), 'logged-in.html')
self.response.out.write(render(tmpl, tContext))
Я хотел бы взять этот шаблонный код и каким-то образом его абстрагировать , может быть, с помощью способа добавления / добавления "настраиваемого" кода для каждого метода класса?
Я думаю, что я мог бы использовать декоратор, чтобы сделать это как-то, но у меня нет наставников по питонам вне stackoverflow, чтобы указать мне правильное направление.Я бы предпочел наиболее питонный метод из возможных, или, по крайней мере, то, что обычно считается «лучшими практиками» в этой ситуации.
Версия Python - 2.7.2.
edit
Заметьте, если я могу сделать это с помощью декораторов, то что мне необходимо для того, чтобы иметь возможность вызывать декоратор из совершенно другого файла класса и файла python?Я хотел бы иметь возможность поместить мои декораторы в один файл и ссылаться на него из другого места, чтобы мой код был максимально нормализован.=)
edit 2
Это тестовый код, который я разработал в консоли, и мне нужно уйти на вечер, или я бы его уточнил.Тем не менее, похоже, что это успешно получает доступ и изменяет свойства класса, что, по-моему, вам нужно, чтобы проверить это в GAE.
class Decorators():
@staticmethod
def BeginInit(pInFunction):
def OutFunction1(self):
print str(self.innerv)
pInFunction(self)
return OutFunction1
@staticmethod
def EndInit(pInFunction):
def OutFunction2(self):
self.innerv = 5
pInFunction(self)
print "this is test 3"
return OutFunction2
class Test2Handler():
innerv = 10
@Decorators.BeginInit
@Decorators.EndInit
def TestPrint(self):
print self.innerv
print "this is test 2"
Prints
10
5
this is test 2
this is test 3