我有装饰器传递变量'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中定义方法的类?
我想要以下示例打印" __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) 我正在尝试编写一个装饰器来做日志记录:
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 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的功能,如果没有,那么完全删除它的理由是什么.
编辑:我刚发现这个问题.这使得看起来最好的解决方案就是像我一样避免它.我仍然想知道为什么它被删除了.
给定方法的引用,有没有办法检查方法是否绑定到对象?你还可以访问它绑定的实例吗?
我正在尝试做这些提议的信号装饰器.除了有一个装饰器将装饰方法连接到一个信号(信号的发送者作为装饰器的参数),我想在类方法上使用装饰器.
我想像这样使用装饰器:
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)直接在方法定义上使用装饰器将其连接到信号?谢谢!
我有一个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)
MyHandler> get(功能)> self(参数)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) 我想写一个装饰器,使类的方法可以被其他方看到; 然而,我所描述的问题与该细节无关.代码看起来大致如下:
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中排除了这种可能性?
我有一个名为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) 我的目标是我不会有一个可以同时使用函数和实例方法的装饰器,并且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)
这确实对我有用,只有一个小例外,当我在多个进程中并行运行测试时,它将引发例外。
在这段代码中:
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?