use*_*728 6 oop types python-3.x
我正在编写装饰器,我需要做的一部分是辨别函数是函数还是方法。有没有办法可以找到给定方法属于哪个类?
例如,如果我要运行这段代码,我可以写什么getOwner来打印exampleFunc类似的内容<class '__main__'.Example>?
class Example:
def method(self):
print("I'm a method")
def exampleFunc(func):
owner = getOwner(func)
print(owner)
test = Example()
exampleFunc(test.method)
Run Code Online (Sandbox Code Playgroud)
如果您需要做的就是弄清楚函数的行为是方法还是函数,这就是该types模块的目的之一。
import types
def is_method(f):
return type(f) == types.MethodType
Run Code Online (Sandbox Code Playgroud)
如果类函数对象是一个方法,您可以如下找到它的父类。
更新修补了 Python3 兼容性。
def method_parent(f):
return f.__self__
Run Code Online (Sandbox Code Playgroud)
如果您引用了范围内定义的类,则需要检查每个类:
def exampleFunc(f):
class_list = [...]
return any(f in vars(c).values() for c in class_List)
Run Code Online (Sandbox Code Playgroud)
True如果函数f是实例方法,这将返回。但是,如果您想返回实际的类名:
def exampleFunc(f):
class_list = [...]
for c in class_list:
if f in vars(c).values():
return c.__name__
return 'global function' if 'lambda' not in f.__name__ else 'lambda'
Run Code Online (Sandbox Code Playgroud)
请注意,这不适用于__dunder__方法以及您的类继承的方法。例如,
class A:
def f1(self): pass
class B(A):
def f2(self): pass
print(vars(B))
mappingproxy({'__doc__': None,
'__module__': '__main__',
'f2': <function __main__.B.f2>})
Run Code Online (Sandbox Code Playgroud)
请注意,这f1不是Bs的一部分mappingproxy。
| 归档时间: |
|
| 查看次数: |
1992 次 |
| 最近记录: |