从d访问函数参数

2024-09-28 17:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个请求处理程序和一个decorator,我想在decorator中使用self对象

class MyHandler(webapp.RequestHandler):

    @myDecorator
        def get(self):
            #code

更新:请注意第一个自我和第二个自我之间的差异

class myDecorator(object):

    def __init__(self, f):
        self.f = f

    def __call__(self):
        #work with self
  1. MyHandler>;get(函数)>;self(参数)
  2. myDecorator>;__call__(函数)>;self(参数)

上面提到的自我论证是不同的。我的意图是从__call__函数内部访问第一个自我,或者找到一种类似的方法。

嗨,我可以从装饰器中的get函数访问MyHandlers自变量吗?

更新2:我想实现一个decorator,以便在google应用程序引擎中使用自定义登录:

我有一个类(requestHandler):

class SomeHandler(webapp.RequestHandler):
    @only_registered_users
    def get(self):
        #do stuff here

我想修饰get函数以检查用户是否登录:

from util.sessions import Session
import logging

class only_registered_users(object):

    def __init__(self, f):
        self.f = f

    def __call__(self):
        def decorated_get(self):
        logging.debug("request object:", self.request)
        session = Session()

        if hasattr(session, 'user_key'):
            return self.f(self)
        else:
            self.request.redirect("/login")


    return decorated_get

如果用户在会话对象中具有“user_key”属性,则我知道该用户是否已登录。

这是我对这个案子感兴趣的主要目标

如果我做错了什么,请告诉我你的建议/意见!

谢谢!


Tags: 对象函数gtselfgetobjectrequestdef
3条回答

我不完全清楚您想要什么,但是如果您只想使用修饰函数的参数,那么这正是一个基本的修饰器所做的。所以要访问,比如说,self.request来自装饰器,您可以执行以下操作:

def log_request(fn):
    def decorated_get(self):
        logging.debug("request object:", self.request)
        return fn(self)
    return decorated_get

class MyHandler(webapp. RequestHandler):
    @log_request
    def get(self):
        self.response.out.write('hello world')

如果您试图访问修饰函数附加到的类,那么它有点棘手,您将不得不使用inspect模块进行一些欺骗。

import inspect

def class_printer(fn):
    cls = inspect.getouterframes(inspect.currentframe())[1][3]
    def decorated_fn(self, msg):
        fn(self,cls+" says: "+msg)
    return decorated_fn

class MyClass():
    @class_printer
    def say(self, msg):
        print msg

在上面的示例中,我们从currentframe(在decorator执行期间)获取类的名称,然后将其存储在decorated函数中。在这里,我们只是在将类名称传递给原始的say函数之前,将类名称放在msg变量的前面,但是一旦有了类名称,就可以使用您的想象力来做任何您喜欢的事情。

>>> MyClass().say('hello')
MyClass says: hello
import random

#decorator to the get function in order to check out if the user is logged in or not
def only_registered_users(func):
    def wrapper(handler):
        print 'Checking if user is logged in'
        if random.randint(0, 1):
            print 'User is logged in. Calling the original function.'
            func(handler)
        else:
            print 'User is NOT logged in. Redirecting...'
            # redirect code here
    return wrapper


class MyHandler(object):

    @only_registered_users
    def get(self):
        print 'Get function called'



m = MyHandler()
m.get()

尝试这种方法:Can a Python decorator of an instance method access the class?

不是完全相同的问题,但是您应该能够使用相同的方法创建对self的引用,或者创建对字典的引用,其中包含可以在装饰器中找到的特定类的对象。

相关问题 更多 >