相关疑难解决方法(0)

带参数的装饰器?

我有装饰器传递变量'insurance_mode'的问题.我会通过以下装饰器声明来做到这一点:

 @execute_complete_reservation(True)
 def test_booking_gta_object(self):
     self.test_select_gta_object()
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这种说法不起作用.也许有更好的方法可以解决这个问题.

def execute_complete_reservation(test_case,insurance_mode):
    def inner_function(self,*args,**kwargs):
        self.test_create_qsf_query()
        test_case(self,*args,**kwargs)
        self.test_select_room_option()
        if insurance_mode:
            self.test_accept_insurance_crosseling()
        else:
            self.test_decline_insurance_crosseling()
        self.test_configure_pax_details()
        self.test_configure_payer_details

    return inner_function
Run Code Online (Sandbox Code Playgroud)

python decorator

361
推荐指数
11
解决办法
21万
查看次数


获取定义方法的类

如何获得在Python中定义方法的类?

我想要以下示例打印" __main__.FooClass":

class FooClass:
    def foo_method(self):
        print "foo"

class BarClass(FooClass):
    pass

bar = BarClass()
print get_class_that_defined_method(bar.foo_method)
Run Code Online (Sandbox Code Playgroud)

python python-2.6 python-datamodel

77
推荐指数
4
解决办法
4万
查看次数

Python装饰器让函数忘记它属于一个类

我正在尝试编写一个装饰器来做日志记录:

def logger(myFunc):
    def new(*args, **keyargs):
        print 'Entering %s.%s' % (myFunc.im_class.__name__, myFunc.__name__)
        return myFunc(*args, **keyargs)

    return new

class C(object):
    @logger
    def f():
        pass

C().f()
Run Code Online (Sandbox Code Playgroud)

我想要打印:

Entering C.f
Run Code Online (Sandbox Code Playgroud)

但我收到此错误消息:

AttributeError: 'function' object has no attribute 'im_class'
Run Code Online (Sandbox Code Playgroud)

据推测,这与'logger'中'myFunc'的范围有关,但我不知道是什么.

python reflection metaprogramming

59
推荐指数
6
解决办法
2万
查看次数

在Python 3中获取未绑定方法对象的定义类

假设我想为类中定义的方法创建装饰器.我希望装饰器在被调用时能够在定义方法的类上设置属性(以便将其注册到用于特定目的的方法列表中).

在Python 2中,该im_class方法很好地完成了这个:

def decorator(method):
  cls = method.im_class
  cls.foo = 'bar'
  return method
Run Code Online (Sandbox Code Playgroud)

但是,在Python 3中,似乎不存在这样的属性(或替代它).我想这个想法是你可以调用type(method.__self__)来获取类,但是这对于未绑定的方法不起作用,因为__self__ == None在那种情况下.

注意:这个问题实际上与我的情况有点无关,因为我选择在方法本身上设置属性,然后让实例扫描其所有方法,在适当的时间查找该属性.我(目前)也在使用Python 2.6.但是,我很好奇是否有替换版本2的功能,如果没有,那么完全删除它的理由是什么.

编辑:我刚发现这个问题.这使得看起来最好的解决方案就是像我一样避免它.我仍然想知道为什么它被删除了.

python python-3.x

35
推荐指数
3
解决办法
2万
查看次数

你如何检查是否绑定了python方法?

给定方法的引用,有没有办法检查方法是否绑定到对象?你还可以访问它绑定的实例吗?

python python-datamodel

33
推荐指数
3
解决办法
9978
查看次数

模型方法的装饰器Django信号?

我正在尝试做这些提议的信号装饰器.除了有一个装饰器将装饰方法连接到一个信号(信号的发送者作为装饰器的参数),我想在类方法上使用装饰器.

我想像这样使用装饰器:

class ModelA(Model):

    @connect.post_save(ModelB)
    @classmethod
    def observe_model_b_saved(cls, sender, instance, created, **kwargs):
        # do some stuff
        pass
Run Code Online (Sandbox Code Playgroud)

装饰者是:

from django.db.models import signals
def post_save(sender):
    def decorator(view):
        signals.post_save.connect(sender=sender, receiver=view)
        return view
    return decorator
Run Code Online (Sandbox Code Playgroud)

我这样做的错误是:

File "/Library/Python/2.6/site-packages//lib/python2.6/site-packages/django/dispatch/dispatcher.py", line 78, in connect
AssertionError: Signal receivers must be callable.

我想问题是@classmethod返回一个不可调用的类方法对象.我真的不明白它是如何classmethod工作的,但我从这个参考页面推测,类方法对象在从类中访问之前不会被转换为可调用的,例如ModelA.observe_model_b_saved.有没有什么办法我可以(1)将我的方法定义为模型上的类或实例方法,以及(2)直接在方法定义上使用装饰器将其连接到信号?谢谢!

python django decorator django-signals django-models

8
推荐指数
1
解决办法
4598
查看次数

从装饰器访问函数参数

我有一个Request处理程序和一个装饰器,我想使用装饰器中的self对象

class MyHandler(webapp.RequestHandler):

    @myDecorator
        def get(self):
            #code
Run Code Online (Sandbox Code Playgroud)

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

class myDecorator(object):

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

    def __call__(self):
        #work with self
Run Code Online (Sandbox Code Playgroud)
  1. MyHandler> get(功能)> self(参数)
  2. myDecorator> __call__(功能)> self(参数)

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

您好,我可以从装饰器内的get函数访问MyHandlers自身参数吗?

Update2:我想实现一个装饰器来使用谷歌应用引擎中的自定义登录:

我有一个类(requestHandler):

class SomeHandler(webapp.RequestHandler):
    @only_registered_users
    def get(self):
        #do stuff here
Run Code Online (Sandbox Code Playgroud)

我想装饰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") …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine decorator

8
推荐指数
1
解决办法
7146
查看次数

如何在Python 3.1中的类构造中找到绑定方法的类?

我想写一个装饰器,使类的方法可以被其他方看到; 然而,我所描述的问题与该细节无关.代码看起来大致如下:

def CLASS_WHERE_METHOD_IS_DEFINED( method ):
  ???

def foobar( method ):
  print( CLASS_WHERE_METHOD_IS_DEFINED( method ) )

class X:

  @foobar
  def f( self, x ):
    return x ** 2
Run Code Online (Sandbox Code Playgroud)

我的问题在于装饰foobar()者看到方法的那一刻,它还无法调用; 相反,它可以看到它的未绑定版本.也许这可以通过在类上使用另一个装饰器来解决,该装饰器将处理对绑定方法必须做的任何事情.我将尝试做的下一件事是在装饰方法通过装饰器时简单地使用属性标记,然后使用类装饰器或元类来进行后处理.如果我得到这个工作,那么我不必解决这个谜语,这仍然让我困惑:

任何人都可以在上面的代码中填写有意义的行,CLASS_WHERE_METHOD_IS_DEFINED以便装饰器可以实际打印出f定义的类,它被定义的那一刻?或者在python 3中排除了这种可能性?

python python-3.x

5
推荐指数
1
解决办法
1087
查看次数

方法调用前检查条件

我有一个名为Server的类,可以启动和停止.除非启动服务器,否则不应调用某些方法,在这种情况下应引发NotConnectedException.有没有办法在类中的每个方法之前调用方法,并确定类变量_started是否设置为True?

我尝试使用装饰器,但装饰器函数无法访问类变量.我试图做这样的事情:

class Server(object):
    _started = False
    def started(self):
        if(self._started == False):
            raise NotConnectedException

    @started
    def doServerAction(self):
       ...
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
1
解决办法
1112
查看次数

如何检测装饰器已应用于方法或函数?

我的目标是我不会有一个可以同时使用函数和实例方法的装饰器,并且self当装饰器应用于方法时,我想在包装函数中检索对象;当应用于函数时,我想检索函数对象本身。 。

这是我发现几乎可以正常使用的功能,这只是我用来检测已应用哪种装饰器的功能:

def _is_method(func):
    for stack_frame in inspect.stack():
        # if the code_context of the stack frame starts with 'class' this
        # function is defined within a class and so a method.
        if inspect.getframeinfo(stack_frame[0]).code_context[0].strip().startswith('class'):
            return True
    return False
Run Code Online (Sandbox Code Playgroud)

这确实对我有用,只有一个小例外,当我在多个进程中并行运行测试时,它将引发例外。

python

5
推荐指数
2
解决办法
3096
查看次数

在 Python 装饰器中获取类

在这段代码中:

def online_only(func, self):
    def f(*args, **kwargs):
        if self.running:
            return func(*args, **kwargs)
        else:
            return False
    return f
class VM(object):
   @property
   def running(self):
       return True
   @property
   @online_only
   def diskinfo(self):
       return True
Run Code Online (Sandbox Code Playgroud)

我希望 diskinfo 仅在 VM.running 返回 True 时运行。如何让 online_only 能够读取 self.running?

python

4
推荐指数
1
解决办法
2671
查看次数