在python中,有3种类型的方法:实例方法,静态方法和类方法。但是让我们看看下面的例子:
class foo:
def inst_method(self, *args, **kwargs): pass
@classmethod
def class_method(cls, *args, **kwargs): pass
@staticmethod
def static_method(*args, **kwargs): pass
def unknown_method(*args, **kwargs):
print('What? ')
def another_unknown():
print('What??? ')
foo.unknown_method() # OK
foo().unknown_method() # OK
foo.another_unknown() # OK
foo().another_unknown() # !!!
在语法上, unknown_method 的定义是有效的,可以在类上调用它。但这种方法属于哪种类型?
感谢我收到的答案,确定unknown_method仍然是一个实例方法,因为self只是一个可选名称;它可以是任何其他名称。
但是another_unknown怎么样?它只能在类上调用,而不能在实例上调用。
答案 0 :(得分:2)
self
只是一个标签。传递给这些函数的第一个参数始终是实例,无论您是否将其称为self
。您可以将其称为this
或blerg
,但传递给该函数的第一个参数将始终是实例。
简短版本:不,没有unknown_method
。它只是inst_method
的另一种类型。
修改强>
other_unknown
根本无法使用,因为会传入一个参数。您将获得TypeError
。
答案 1 :(得分:2)
这仍然是常规实例方法。您可以这样证明:
>>> class Foo:
mystery_method(*args, **kwargs):
print(*args, sep = '\n')
>>> f = Foo(1, 'bar', None)
>>> f.mystery_method()
<__main__.Foo object at XXXX>
1
bar
None
正如您所看到的,我们只传递了3个参数,但是打印了四个参数。 *args
的第一个成员已绑定到对象实例,就像使用任何其他常规实例方法一样。
使用self
作为第一个参数只是一个约定。
您给出的另一个方法示例(没有参数)只会引发异常,因为Python会尝试将类实例传递给方法,但该方法接受零参数。它仍然是一种实例方法。