以下是通过 inspect 库获取类内方法的两端代码:
Python2
>>> class A(object):
... def a(self):
... print('a')
...
... @staticmethod
... def b():
... print('b')
...
... @classmethod
... def c(cls):
... print('c')
...
>>> import inspect
>>> inspect.getmembers(A, inspect.ismethod)
[('a', <unbound method A.a>), ('c', <bound method type.c of <class '__main__.A'>>)]
Python3
>>> class A(object):
... def a(self):
... print('a')
...
... @staticmethod
... def b():
... print('b')
...
... @classmethod
... def c(cls):
... print('c')
...
>>> import inspect
>>> inspect.getmembers(A, inspect.ismethod)
[('c', <bound method A.c of <class '__main__.A'>>)]
可以看到对于类而言,实例方法在 Python3 中已经不再是method,而是function。
>>> inspect.getmembers(A, inspect.isfunction)
[('a', <function A.a at 0x10d46e598>), ('b', <function A.b at 0x10d46e620>)]
通过查阅两个版本的 inspect 文档可以看到在Python2中:
inspect.ismethod(object)
Return true if the object is a bound or unbound method written in Python.
相对于在Python3中:
inspect.ismethod(object)
Return true if the object is a bound method written in Python.
ismethod不在包含 unbound method 了。
这是否是 Python2 到 Python3 后的通识区别?可惜这么重要的区别并没有被大多数的 “ Differences between Python2 and Python3 ” 之类的文章提到。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.