对象的某些callable()
属性属于<class 'method-wrapper'>
类型。是否可以检查可调用类型是否为method-wrapper
类型?
例如isinstance(object, methodwrapper)
或类似的东西?
基本上我想要实现的是:我有一个a
类型的对象A
,我想序列化它,以便我可以通过网络发送它。我还想“序列化”该对象的方法。特别是,我想通过线路发送每个方法的源代码,以便它可以在另一侧的某个范围内执行,并注入到a
的重新创建中,因为这些方法可能已被更改或者更新等等。所以我查看了所有方法,一次“序列化”一个,然后通过网络发送attribute_name -> attribute
的json字典。但我不想尝试序列化method-wrapper
类型的方法。现在,只有一种方法是尝试在尝试序列化method-wrappers
时尝试捕获异常,但我想知道是否还有其他方法。
答案 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__)