Python 如何检查对象属性是否为方法包装器类型?

Python 如何检查对象属性是否为方法包装器类型?,python,metaprogramming,Python,Metaprogramming,对象的某些callable()属性属于类型。是否可以检查可调用对象的类型是否为方法包装器 例如isinstance(对象、方法包装器)或类似的东西 基本上,我试图实现的是:我有一个类型为a的对象a,我想序列化它,以便通过网络发送它。我还想“序列化”该对象的方法。特别是,我想通过连线发送每个方法的源代码,以便它可以在另一端的某个范围内执行,并注入到a的重新创建中,因为这些方法可能已被更改或更新等。因此我检查了所有方法,“序列化”一次一个,然后通过网络发送json字典attribute\u nam

对象的某些
callable()
属性属于
类型。是否可以检查可调用对象的类型是否为
方法包装器

例如
isinstance(对象、方法包装器)
或类似的东西



基本上,我试图实现的是:我有一个类型为
a
的对象
a
,我想序列化它,以便通过网络发送它。我还想“序列化”该对象的方法。特别是,我想通过连线发送每个方法的源代码,以便它可以在另一端的某个范围内执行,并注入到
a
的重新创建中,因为这些方法可能已被更改或更新等。因此我检查了所有方法,“序列化”一次一个,然后通过网络发送json字典
attribute\u name->attribute
。但是我不想尝试序列化
方法包装器
类型的方法。现在,一种方法是在尝试序列化
方法包装时尝试捕获异常,但我想知道是否还有其他方法。

至少,您可以执行
str(type(a.foo))=='
或类似操作。如果您有一个确定的方法来找到这样打印的方法,那么您还应该能够执行
methodwrapper=a.foo.\uuu class\uuu
,这样您就可以执行
isinstance(foo,methodwrapper)
。然而,很可能有一个模块直接公开了这些,但我看不到它在
内置中。不知道还能去哪里看

编辑:

>>> type(all.__call__)
<type 'method-wrapper'>
>>>类型(全部调用)

至少,你可以做
str(type(a.foo))=='
或类似的事情。如果您有一个确定的方法来找到这样打印的方法,那么您还应该能够执行
methodwrapper=a.foo.\uuu class\uuu
,这样您就可以执行
isinstance(foo,methodwrapper)
。然而,很可能有一个模块直接公开了这些,但我看不到它在
内置中。不知道还能去哪里看

编辑:

>>> type(all.__call__)
<type 'method-wrapper'>
>>>类型(全部调用)

这既是可能的,也是不推荐的

'method-wrapper'
是一种实现类型,因此特定于cPython

Python 2.7.5+ (default, Sep 19 2013, 13:49:51) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> object().__str__
<method-wrapper '__str__' of object object at 0xb74dd4d0>
>>> type(object().__str__)
<type 'method-wrapper'>
我在cPython做了以下工作:

>>> isinstance(T(1).thing,type(object().__str__))
False
现在在pypy中:

>>>> isinstance(T(1).thing,type(object().__str__))
True

所以。如果你能提供更多你想要完成的事情的细节,这可能会有所帮助。否则,我就把上面的警示故事留给大家。

这既有可能,也不推荐

'method-wrapper'
是一种实现类型,因此特定于cPython

Python 2.7.5+ (default, Sep 19 2013, 13:49:51) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> object().__str__
<method-wrapper '__str__' of object object at 0xb74dd4d0>
>>> type(object().__str__)
<type 'method-wrapper'>
我在cPython做了以下工作:

>>> isinstance(T(1).thing,type(object().__str__))
False
现在在pypy中:

>>>> isinstance(T(1).thing,type(object().__str__))
True

所以。如果你能提供更多你想要完成的事情的细节,这可能会有所帮助。否则,我将给您留下上面的警示故事。

预先选择一个随机的,并希望它是实现的基类

isinstance(foo, dict.__len__.__class__) 

预处理随机选取一个,并希望它是实现的基类

isinstance(foo, dict.__len__.__class__) 

谢谢你的解释。我意识到这不是个好主意。请查看上面对我的问题的编辑,了解我为什么要做我想做的事情。再次感谢!谢谢你的解释。我意识到这不是个好主意。请查看上面对我的问题的编辑,了解我为什么要做我想做的事情。再次感谢!一般来说,序列化可执行代码不是一项简单的任务。例如,对于纯函数,代码可能引用自由变量。但是,我猜您正在序列化字节码——im_func等等。在这种情况下,您需要确保另一端的解释器是相同的版本,否则它将不可靠。你能从文件中序列化源代码吗?或者从反汇编代码中重新创建它?也许是这个?我正在序列化函数的源代码,而不是实际的代码对象或VM代码。一般来说,序列化可执行代码不是一项简单的任务。例如,对于纯函数,代码可能引用自由变量。但是,我猜您正在序列化字节码——im_func等等。在这种情况下,您需要确保另一端的解释器是相同的版本,否则它将不可靠。你能从文件中序列化源代码吗?或者从反汇编代码中重新创建它?也许是这个?我正在序列化函数的源代码,而不是实际的代码对象或VM代码。这就是我现在使用的。也许我会切换到使用您添加的编辑方法。谢谢。这是我现在用的。也许我会切换到使用您添加的编辑方法。谢谢