除了实例方法,静态方法和类方法,Python中还有第四种类型的方法吗?

时间:2017-05-08 00:58:21

标签: python oop methods

在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怎么样?它只能在类上调用,而不能在实例上调用。

2 个答案:

答案 0 :(得分:2)

self只是一个标签。传递给这些函数的第一个参数始终是实例,无论您是否将其称为self。您可以将其称为thisblerg,但传递给该函数的第一个参数将始终是实例。

简短版本:不,没有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会尝试将类实例传递给方法,但该方法接受零参数。它仍然是一种实例方法。