我刚刚发布了这个。我一直在取得一些进展,这似乎比我想象的更棘手。 Python: Getting the name of a callable function argument
我在@wraps
取得了进展,现在我能够进一步发展。这是一个独立的问题,值得拥有自己的主题。
很快,我怎么能以某种方式访问类实例,其成员是函数调用?这是一个完整且有效的代码片段,用于说明问题(仅限python 3)。
如果有人关心,我在其他帖子中解释了我需要这样做的原因。当我调用b.set_something()
时,参数是对a的方法调用。但是因为没有方法" set_something_else"在A中,它被__getattr__()
hack抓住,我正在努力确定我正在使用的内容,因为我需要"解释"通过远程服务器的消息传递协议,哪个类实例执行哪些功能,可能的可调参数传递给其他类。
所以我想为每个类实例添加一个id并将其用作引用。当我的b
对象收到b.get_something()
的调用a.get_something_else
作为参数时,我现在可以因为@wraps在我的b中检测到了
现在唯一缺少的链接就是抓住" id"来自A的实例,其成员get_something_else
恰好是。这将允许我在远程端将所有内容链接在一起。但是如何从B中引用它呢?我唯一的信息是可调用参数a.get_something_else。我能够自由地修改类Foo和Bar,但不能最后部分修改变量a和b。
from functools import wraps
import uuid
class Bar:
def __init__(self):
self.id = str(uuid.uuid4())
def __getattr__(self, name):
@wraps(name)
def foo(*args, **kwargs):
_kwa = {}
for k, v in kwargs.items():
if callable(v):
cn = "{}.{}".format(v.__qualname__.split(".")[0], v.__wrapped__)
# How to get "id" from the object whose member v is??
_kwa[k] = cn
continue
else:
_kwa[k] = v
x = {"args": args, "kwargs": _kwa}
print(x)
return foo
class Foo:
def __init__(self):
self.id = str(uuid.uuid4())
def __getattr__(self, name):
@wraps(name)
def foo(*args, **kwargs):
_kwa = {}
for k, v in kwargs.items():
if callable(v):
cn = "{}.{}".format(v.__qualname__.split(".")[0], v.__wrapped__)
_kwa[k] = cn
continue
else:
_kwa[k] = v
x = {"args": args, "kwargs": _kwa}
print(x)
return foo
a = Foo()
b = Bar()
b.set_something(command=a.set_something_else)
答案 0 :(得分:0)
不确定这是否正是您想要的,但是您检查了超级功能吗? 类Parent(): Def init (self): super(父母,自我)。 init ()