如何检查object属性是否为method-wrapper类型?

时间:2013-11-11 06:43:26

标签: python metaprogramming

对象的某些callable()属性属于<class 'method-wrapper'>类型。是否可以检查可调用类型是否为method-wrapper类型?

例如isinstance(object, methodwrapper)或类似的东西?


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

3 个答案:

答案 0 :(得分:3)

这是可能的,不推荐。

'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'>

好的,但是......

Python 2.7.3 (2.0.2+dfsg-4, Jun 28 2013, 11:25:07)
[PyPy 2.0.2 with GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``"that's however just engineering"
(fijal)''
>>>> object().__str__
<bound method object.__str__ of <object object at 0xb6bd29e8>>
>>>> type(object().__str__)
<type 'method'>

因此,要强调这种类型检查的想法是多么不好,一些示例代码:

class T(object):
    def __init__(self, val):
        self.val = val
    def thing(self):
        pass

我在cPython中执行以下操作:

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

现在在pypy:

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

因此。如果您提供了有关您要完成的更多详细信息,那可能会有所帮助。否则我会给你留下上述警示故事。

答案 1 :(得分:1)

至少,你可以做str(type(a.foo)) == '<class 'method-wrapper'>或类似的事情。如果您有一种有保证的方法可以找到这样打印的方法,那么您还应该能够执行methodwrapper = a.foo.__class__,这样您就可以isinstance(foo, methodwrapper)。但是,很可能有一个直接暴露这些模块的模块,但我不能在builtins中看到它。不确定在哪里可以看。

编辑:

>>> type(all.__call__)
<type 'method-wrapper'>

答案 2 :(得分:0)

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

isinstance(foo, dict.__len__.__class__)