我想将特定类的每个方法包装在python中,并且希望通过最少地编辑该类的代码来实现。我应该怎么做?
Michael
Foord的Voidspace博客的一个条目中介绍了一种优雅的实现方法,该条目在“方法修饰元类的方法”部分中介绍了什么是元类以及如何使用它们。稍微简化一下,然后将其应用于您的情况会导致以下结果:
from types import FunctionType
from functools import wraps
def wrapper(method):
@wraps(method)
def wrapped(*args, **kwrds):
# ... <do something to/with "method" or the result of calling it>
return wrapped
class MetaClass(type):
def __new__(meta, classname, bases, classDict):
newClassDict = {}
for attributeName, attribute in classDict.items():
if isinstance(attribute, FunctionType):
# replace it with a wrapped version
attribute = wrapper(attribute)
newClassDict[attributeName] = attribute
return type.__new__(meta, classname, bases, newClassDict)
class MyClass(object):
__metaclass__ = MetaClass # wrap all the methods
def method1(self, ...):
# ...etc ...
在Python中,函数/方法装饰器只是函数包装器和一些语法糖,以使其易于使用(更美观)。
Python 3兼容性更新
先前的代码使用Python 2.x元类语法,需要进行翻译才能在Python 3.x中使用,但是在先前的版本中将不再起作用。这意味着它将需要使用:
class MyClass(metaclass=MetaClass)
...
代替:
class MyClass(object):
__metaclass__ = MetaClass"
...
如果需要,可以编写与Python 2.x 和
3.x兼容的代码,但是这样做需要使用稍微复杂一些的技术,该技术可以动态创建一个继承所需元类的新基类,从而避免由于两个Python版本之间的语法差异。这基本上就是本杰明·彼得森的六个模块的with_metaclass()
功能。
from types import FunctionType
from functools import wraps
def wrapper(method):
@wraps(method)
def wrapped(*args, **kwrds):
print('{!r} executing'.format(method.__name__))
return method(*args, **kwrds)
return wrapped
class MetaClass(type):
def __new__(meta, classname, bases, classDict):
newClassDict = {}
for attributeName, attribute in classDict.items():
if isinstance(attribute, FunctionType):
# replace it with a wrapped version
attribute = wrapper(attribute)
newClassDict[attributeName] = attribute
return type.__new__(meta, classname, bases, newClassDict)
def with_metaclass(meta):
""" Create an empty class with the supplied bases and metaclass. """
return type.__new__(meta, "TempBaseClass", (object,), {})
if __name__ == '__main__':
# Inherit metaclass from a dynamically-created base class.
class MyClass(with_metaclass(MetaClass)):
@staticmethod
def a_static_method():
pass
@classmethod
def a_class_method(cls):
pass
def a_method(self):
pass
instance = MyClass()
instance.a_static_method() # Not decorated.
instance.a_class_method() # Not decorated.
instance.a_method() # -> 'a_method' executing
问题内容: 我必须对一个大型Java项目做一个一般性的说明,但是我对它的了解很少,我想知道是否有确定以下内容的准则: 每个包有多少个类可以被认为是正确的,低或高的(这个项目每个包有3.89个类,对我来说似乎太小了), 每个类有多少种方法?(该项目每个类有6.54个方法… 每个方法的行数?(此项目每种方法大约有7行(对我来说似乎不错,也许有点低)) 我应该指出,这个问题仅涉及体积。我有很多来自质量工
我们有一个使用< code>Spring OAuth2的rest API。用户通过身份验证后,所有JSON响应都采用以下格式: 但是,身份验证失败的JSON响应与上述格式不符,因为这是由Spring处理的。 例如,在凭据不正确的情况下,客户端会获得带有JSON响应的HTTP状态代码400,如下所示: 如果用户帐户被锁定,客户端将获得 HTTP 状态代码 400,并按 JSON 响应进行如下操作 所
有一个应用是这样安装的,以root身份登陆vps(debian11): 我可否为这个应用制作一个docker镜像呢?用docker run来达到我上面那些代码的目的? 报错了 我的镜像源 我的本地代理可以使用 在构建镜像时,使用代理 还是报错
问题内容: 我收到以下错误: 这是我的组件: 我在这里做错了什么? 问题答案: 由于您已经使用过,因此该组件将无法作为道具使用。由于您已经使用过,作业操作将作为道具提供,您可以像这样使用它们 但是您可以进一步简化它,例如
问题内容: 我有装饰器应用于方法: 有没有我可以申请的方式对 每一个 前缀类的方法? 换句话说,装饰将适用于, 下面,但不是方法。 问题答案: 在Python 2.6中,类装饰器无疑是必经之路。例如,这是用于此类任务的非常通用的代码: 而现在, 会得到你想要的东西。在Python 2.5或更低版本中,语法不适用于类修饰,但是如果使用完全相同的代码,则可以在语句结束 后立即 将其替换为以下语句:
我正在开发一个Android 2.3.3应用程序,我需要每X秒运行一个方法。 在iOS,我有NSTmer,但在Android我不知道用什么。 有人向我推荐了Handler;另一个人向我推荐了AramManager,但我不知道哪种方法更适合NSTmer。 这是我想在Android中实现的代码: 我需要像NSTmer这样的东西。 你给我推荐什么?