重写 python 函数而不使用检查模块

发布于 2024-10-27 22:04:56 字数 463 浏览 0 评论 0原文

在不使用检查模块的情况下,我将如何编写这个内省函数。

import inspect

def trace(cls):
    for name, m in inspect.getmembers(cls, inspect.ismethod):
        setattr(cls,name,log(m))
    return cls

以上来自 这个问题/回答

编辑/澄清: 是否可以在不进行任何导入的情况下执行此操作?

请注意,这不是一个真正的用例,而是我出于好奇而纯粹而简单的案例。

How would I write this introspective function without using the inspect module.

import inspect

def trace(cls):
    for name, m in inspect.getmembers(cls, inspect.ismethod):
        setattr(cls,name,log(m))
    return cls

The above is from this SO question/answer

Edit/Clarification:
Is it possible to do this without any imports also?

Note this is not a real use case rather a pure and simple case of curiosity on my part.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情归归情 2024-11-03 22:04:57

inspect.ismmethod 的作用是 简单< /a>:

import types
def ismethod(obj):
   return isinstance(obj, types.MethodType)

types.MethodType定义为

class _C:
   def _m(self): pass
MethodType = type(_C()._m)

What inspect.ismethod does is simply:

import types
def ismethod(obj):
   return isinstance(obj, types.MethodType)

and types.MethodType is defined as:

class _C:
   def _m(self): pass
MethodType = type(_C()._m)
这个俗人 2024-11-03 22:04:57

如果不使用检查,我会这样做:

import types

def trace(cls):
    for attr_name in cls.__dict__:
        attr = getattr(cls, attr_name)
        if isinstance(attr, types.MethodType):
            setattr(cls, attr_name, log(attr))
    return cls

编辑:

你的约束有点奇怪,但让我们看看:

我们可以用<替换if isinstance(attr, types.MethodType) code>if callable(attr) 这将只给我们类的可调用属性,其中还包括静态方法和类方法...

我们也可以按照其他答案建议使用 if hasattr(attr, 'im_func') 这将排除静态方法。

如果我们也想排除类方法(仅获取实例方法),我认为我现在知道的唯一解决方案(不导入其他模块)是通过更改装饰器来检查第一个参数是类还是实例,这可以给您提示将要修饰的方法是类方法还是实例方法。

希望它有帮助:)

Without using inspect i will do it like this:

import types

def trace(cls):
    for attr_name in cls.__dict__:
        attr = getattr(cls, attr_name)
        if isinstance(attr, types.MethodType):
            setattr(cls, attr_name, log(attr))
    return cls

EDIT:

Your constrain are a bit weird but let see :

We can replace if isinstance(attr, types.MethodType) by if callable(attr) this will give us only callable attribute of the class which include also static methods and class methods ...

We can also do as the other answer suggest use if hasattr(attr, 'im_func') this will exclude the static methods.

If we want to exclude class method too (only get instance method), i think the only solution i'm aware off now (without importing an other module) is by changing the decorator to check if the first argument is a class or an instance, this can give you a hint if the method that will be decorated is a class or a instance method.

Hope it help :)

终难遇 2024-11-03 22:04:56

像这样的东西:

>>> class Tester(object):
...   def mymethod(self):
...     return True
... 
>>> hasattr(Tester, 'mymethod')
True
>>> hasattr(Tester.mymethod, 'im_func')
True

来自数据模型 向下滚动一点到达“用户定义的方法”。

特殊只读属性:im_self是类实例对象,im_func是函数对象;对于绑定方法,im_class 是 im_self 的类;对于非绑定方法,im_class 是请求该方法的类; __doc__ 是方法的文档(与 im_func.__doc__ 相同); __name__ 是方法名称(与 im_func.__name__ 相同); __module__ 是定义该方法的模块的名称,如果不可用则为 None。

自 2.6 起,im_func 和 im_self 也分别可用作 __func____self__
我有点倾向于这里而不是自己使用检查模块。

something like this:

>>> class Tester(object):
...   def mymethod(self):
...     return True
... 
>>> hasattr(Tester, 'mymethod')
True
>>> hasattr(Tester.mymethod, 'im_func')
True

from the python docs on the data model scroll down a bit to get to "user defined methods".

Special read-only attributes: im_self is the class instance object, im_func is the function object; im_class is the class of im_self for bound methods or the class that asked for the method for unbound methods; __doc__ is the method’s documentation (same as im_func.__doc__); __name__ is the method name (same as im_func.__name__); __module__ is the name of the module the method was defined in, or None if unavailable.

im_func and im_self as of 2.6 are also availabale as __func__ and __self__ respectively.
I sort of tend to gravitate here than use the inspect module myself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文