TL;DR
Normal Method (class)
class A:
def show(self, s):
print(self, s)
def show_self(s):
print(s)
a = A()
A.show(1, 2)
A.show_self(3)
输出:
1 2
3
传入什么就是什么,没有任何特别之处。就像一个普通的函数。
Normal Method (instance)
class A:
def show(self, s):
print(self, s)
def show_self(s):
print(s)
a = A()
a.show(1)
a.show_self()
输出:
<__main__.A object at 0x1020e43c8> 1
<__main__.A object at 0x1020e43c8>
instance.method() 这种格式,默认第一个参数是 self (隐性参数),指代实例本身。所以即使括号无参数,也会输出实例本身。
@classmethod
class A:
@classmethod
def show(cls, s):
print(cls, s)
a = A()
a.show(1)
A.show(2)
输出:
<class '__main__.A'> 1
<class '__main__.A'> 2
类似于普通方法会把第一个参数变成 self 指代实例本身,classmethod 会把方法的第一个参数变成 cls 指代类本身。如果是用实例调用,则效果和用类一样。
官方解释:A class method receives the class as implicit first argument, just like an instance method receives the instance.
@staticmethod
class A:
@staticmethod
def show(self, s):
print(self, s)
a = A()
a.show(3, 4)
A.show(1, 2)
官方解释:A static method does not receive an implicit first argument. 说白了就是把方法变成彻底的普通方法,无论是类还是实例调用都不存在 self, cls 这种隐性参数。
网友评论