- 实例方法 - 实例,即
self
- 类方法 - 类,即
cls
- 静态方法 - 无
Test
类中实现了这些经典方法,包括一个普通方法:class Test():
def __init__(self):
pass
def instance_mthd(self):
print("Instance method.")
@classmethod
def class_mthd(cls):
print("Class method.")
@staticmethod
def static_mthd():
print("Static method.")
def unknown_mthd():
# No decoration --> instance method, but
# No self (or cls) --> static method, so ... (?)
print("Unknown method.")
在Python 3中,可以安全地调用
unknown_mthd
,但在Python 2中会引发错误:>>> t = Test()
>>> # Python 3
>>> t.instance_mthd()
>>> Test.class_mthd()
>>> t.static_mthd()
>>> Test.unknown_mthd()
Instance method.
Class method.
Static method.
Unknown method.
>>> # Python 2
>>> Test.unknown_mthd()
TypeError: unbound method unknown_mthd() must be called with Test instance as first argument (got nothing instead)
这个错误表明在Python 2中没有意图使用这种方法。也许现在允许这样做是由于Python 3中取消了未绑定方法(REF 001)。此外,
unknown_mthd
不接受args,并且可以像staticmethod一样由类调用,Test.unknown_mthd()
。但它不是一个显式的staticmethod(没有装饰器)。问题
- 在Python 3的设计中,以这种方式创建方法(没有args,而不明确地装饰为staticmethod)是有意的吗?更新
- 在经典方法类型中,
unknown_mthd
是哪种类型的方法? - 为什么可以通过类调用
unknown_mthd
而不传递参数?
一些初步检查得出的结果并不确定:
>>> # Types
>>> print("i", type(t.instance_mthd))
>>> print("c", type(Test.class_mthd))
>>> print("s", type(t.static_mthd))
>>> print("u", type(Test.unknown_mthd))
>>> print()
>>> # __dict__ Types, REF 002
>>> print("i", type(t.__class__.__dict__["instance_mthd"]))
>>> print("c", type(t.__class__.__dict__["class_mthd"]))
>>> print("s", type(t.__class__.__dict__["static_mthd"]))
>>> print("u", type(t.__class__.__dict__["unknown_mthd"]))
>>> print()
i <class 'method'>
c <class 'method'>
s <class 'function'>
u <class 'function'>
i <class 'function'>
c <class 'classmethod'>
s <class 'staticmethod'>
u <class 'function'>
第一组类型检查表明
unknown_mthd
类似于一个静态方法。第二组检查表明它更像是一个实例方法。我不确定这个方法是什么,也不知道为什么要使用它而不是经典的方法。我希望能得到一些关于如何检查和更好地理解它的建议。谢谢。REF 001: Python 3中的新功能:“未绑定的方法”已被移除 REF 002: 如何在Python 3中区分实例方法、类方法、静态方法或函数? REF 003: Python中@staticmethod有什么用处?
unknown_mthd
一样,但是被接受的答案实际上是指一个实例方法。然而,t.unknown_mthd()
会引发错误。 - pylang