前言
python3 类里面常用的方法有3个:静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)
本篇讲解这3种方法在使用上有什么区别。
函数
先从函数说起,方法跟函数是有区别的,经常有人容易混淆,函数定义是def关键字定义(外面没有class)
def fun(): xx="hehe" return xx a=fun() print(a)
函数调用使用函数名称后面加括号就能调用了
实例方法(self)
类里面的方法定义也是用def关键字,注意在类里面叫方法了,不叫函数,定义的方法默认在括号里面加一个self参数。
self是类本身的实例对象,所以在看到def定义的方法括号后面有self参数的叫实例方法。
class He: def fun(self): print("He的:{}".format(id(He))) print(id(self)) b='xi' return b a=He() print(id(a)) a.fun() # He.fun() # 报错 fun() missing 1 required positional argument: 'self'
fun()里面带了self参数,那么它是实例方法,也就是He()实例对象的方法了,所以必须先实例化He()才能调用此方法。
静态方法(@staticmethod)
我们可以在函数里面写一个类
def fun(): a = "hello" class A(object): count = 0 def fun(self): b = "world" return b return A x=fun() y=x().fun() print(y)
于是会想到,在类里面是不是也可以写一个函数呢?于是就有了静态方法(@staticmethod),静态方法的出现就是为了在类里面可以写一个函数,当普通的函数去调用。
定义静态方法需使用@staticmethod装饰器,并且括号后面不需要self参数了。
class He: count=0 def fun(self): b="hello" return b @staticmethod def start(): print("开始学习了---") He.start() #不用实例化,也能调用 a=He() #实例化也能调用 a.start()
静态方法不需要实例化可以直接调用,实例化后也能调用,可以理解成函数。
类方法(@classmethod)
类里面有2个概念,属性和方法
He类和He()实例对象的属性是不一样的,比如
- He类只有count属性
- He()实例对象的属性是__init__里面的age和name,并且包含He类的属性count
class He: count=1 def __init__(self): self.age=16 self.name='xixi' print(He.count) #类只有count属性 # print(He.age) #type object 'He' has no attribute 'age' a=He() #类实例,实例化对象 print(a.count) print(a.age) print(a.name)
既然已经知道了He类的属性和He() 实例对象属性是不一样的,再回到前面的实例方法概念上,实例方法是He() 实例对象的方法。
既然He()实例对象有实例方法,那么He类当然也有类方法的概念了,于是可以在方法上加上@classmethod装饰器声明它是类方法,并且括号第一个参数cls是指类本身
class He: count=1 def fun(self): b="xixi" return b @staticmethod def start(): print("开始了") @classmethod def begin(cls): print("begin--") He.begin() #不需要实例化,类名称直接调用类方法 a=He() #实例化也能调用类方法 a.begin()