方法的划分
class Person:
def abc(self):
print("这是一个实例方法", self)
@classmethod
def classm(cls):
print("这是一个类方法", cls)
@staticmethod
def staticm():
print("这是一个静态方法")
p = Person()
print(p) # 输出为:<__main__.Person object at 0x000001C74DE064E0>
p.abc() # 输出为:这是一个实例方法 <__main__.Person object at 0x000001C74DE064E0>
# 可以看出二者的地址相同,self 就是Person的实例p
Person.abc() # 报错:abc() missing 1 required positional argument: 'self'
Person.classm() # 输出为:这是一个类方法 <class '__main__.Person'>
# 可以看出,cls就是类Person
Person.staticm() # 输出为:这是一个静态方法
注意事项
1.划分依据:方法的第一个参数必须要接收的数据类型。
2.不管是哪一种类型方法,它们都是存储子啊类当中,而不是在实例中。
print(p.__dict__) # 输出为:{}
print(Person.__dict__) #输出为:{'__module__': '__main__',
#'abc': <function Person.abc at 0x000001B24A88B620>,
#'classm': <classmethod object at 0x000001B24A896470>,
#'staticm': <staticmethod object at 0x000001B24A8964A8>,
#'__dict__': <attribute '__dict__' of 'Person' objects>,
#'__weakref__': <attribute '__weakref__' of 'Person'objects>, '__doc__': None}