【问题标题】:How to dynamically add method to object while preserving the same signature?如何在保留相同签名的同时向对象动态添加方法?
【发布时间】:2021-09-11 11:03:23
【问题描述】:

我只想将一个对象的所有成员变量和方法复制到另一个对象。

我使用setattr() 函数作为成员变量,types.MethodType 作为方法, 但在这种情况下,复制的函数在inspect.signature 中没有任何内容。

我也想复制参数列表。我该怎么做?

下面我举个例子:

import inspect

class source:
  def func1(self, a: str, b: int):
    print(a, "%d"%b)

class dest:
  pass

s = source()
d = dest()

# copy s -> d

inspect.signature(d.func1)
# -> Out: <Signature (a:str, b:int)>

【问题讨论】:

    标签: python dynamic parameters signature inspect


    【解决方案1】:

    方法是它们所绑定的class 的属性,这是inspect 寻找它们的地方。这意味着您必须将它们从Source class 复制到Dest class。当您这样做时,它们当然会自动具有相同的签名。

    import inspect
    
    class Source:
        def func1(self, a: str, b: int):
            print(a, "%d"%b)
    
    class Dest:
        pass
    
    s = Source()
    d = Dest()
    
    print(inspect.signature(s.func1))  # -> (self, a: str, b: int)
    setattr(type(d), 'func1', Source.func1)
    print(inspect.signature(d.func1))  # -> (self, a: str, b: int)
    d.func1('ans', 42)  # -> ans 42
    
    

    【讨论】:

    • 感谢您的回复。我检查了这段代码是否有效。
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2011-02-25
    • 2020-04-04
    • 2014-09-25
    • 2021-09-27
    相关资源
    最近更新 更多