1

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

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


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

4

3 回答 3

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

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

于 2013-11-11T07:35:03.193 回答
1

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

编辑:

>>> type(all.__call__)
<type 'method-wrapper'>
于 2013-11-11T07:23:59.380 回答
0

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

isinstance(foo, dict.__len__.__class__) 
于 2014-06-04T21:06:26.663 回答