引用类方法的父级

时间:2018-02-20 15:36:26

标签: python python-3.x class

我刚刚发布了这个。我一直在取得一些进展,这似乎比我想象的更棘手。 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中检测到了

  1. 该功能属于A类
  2. 函数名称为" get_something_else"
  3. 现在唯一缺少的链接就是抓住" 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)
    

1 个答案:

答案 0 :(得分:0)

不确定这是否正是您想要的,但是您检查了超级功能吗? 类Parent():        Def init (self):            super(父母,自我)。 init ()