1.开篇引入
class A: #类属性 explantion = "this is my programs" #普通方法,或者实例方法 def normaMethod(self,name): print(self.explantion) #类方法,可以访问类属性 @classmethod def classMethod(cls,explanation): print(cls.explantion) #静态方法,不可以访问类属性 @staticmethod def staticMethod(explanation): print(staticmethod) a = A() a.explantion = "this is new" print(a.normaMethod("explanation"))
结果:
C:Usersg1702543PycharmProjectsuntitledvenvScriptspython.exe "C:/Users/g1702543/PycharmProjects/untitled/Day12/普通 类 静态方法.py" this is new None
首先形式上的区别,实例方法隐含的参数为类实例self,而类方法隐含的参数为类本身cls。 静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。
所以逻辑上,类方法被类调用,实例方法被实例调用,静态方法两者都能调用。主要区别在于参数传递上的区别,实例方法悄悄传递的是self引用作为参数,而类方法悄悄传递的是cls引用作为参数。
2.类和实例是否调用类的属性
class A: #类属性 explantion = "this is my programs" #普通方法,或者实例方法 def normaMethod(self,name): print(self.explantion) #类方法,可以访问类属性 @classmethod def classMethod(cls,explanation): print(cls.explantion) #静态方法,不可以访问类属性 @staticmethod def staticMethod(explanation): print(staticmethod) a = A() a.explantion = "this is new" print(a.normaMethod("explanation")) #print(A.normaMethod("explanation")) ##error
结果:实例方法(普通方法)由实例调用,类不能调用
3.类方法是否可以类调用或者实例调用
class A: #类属性 explantion = "this is my programs" #普通方法,或者实例方法 def normaMethod(self,name): print(self.explantion) #类方法,可以访问类属性 @classmethod def classMethod(cls,explanation): print(cls.explantion) #静态方法,不可以访问类属性 @staticmethod def staticMethod(explanation): print(staticmethod) a = A() a.explantion = "this is new" print(a.classMethod("explanation")) print(A.classMethod("explanation"))
结果:类方法可以由类调用(因为传入参数cls),与实例调用
C:Usersg1702543PycharmProjectsuntitledvenvScriptspython.exe "C:/Users/g1702543/PycharmProjects/untitled/Day12/普通 类 静态方法.py"
this is my programs
None
this is my programs
None
4.调用类方法和静态方法区别
class A: #类属性 explantion = "this is my programs" #普通方法,或者实例方法 def normaMethod(self,name): print(self.explantion) #类方法,可以访问类属性 @classmethod def classMethod(cls,explanation): print(cls.explantion) #静态方法,不可以访问类属性 @staticmethod def staticMethod(explanation): print(staticmethod) a = A() a.explantion = "this is new" print(a.classMethod("explanation")) print(A.classMethod("explanation")) print(a.staticMethod("explanation")) print(A.staticMethod("explanation"))
结果:
C:Usersg1702543PycharmProjectsuntitledvenvScriptspython.exe "C:/Users/g1702543/PycharmProjects/untitled/Day12/普通 类 静态方法.py" this is my programs None this is my programs None <class 'staticmethod'> None <class 'staticmethod'> None
5.property将一个方法变成静态属性
可以让类与实例进行调用
class A: #类属性 explantion = "this is my programs" #普通方法,或者实例方法 def normaMethod(self,name): print(self.explantion) #类方法,可以访问类属性 @classmethod def classMethod(cls,explanation): print(cls.explantion) #静态方法,不可以访问类属性 @staticmethod def staticMethod(explanation): print(staticmethod) @property def shuxing(self): print(self.explantion)
a = A()
a.shuxing
print(A.classMethod("explanation"))
结果:
C:Usersg1702543PycharmProjectsuntitledvenvScriptspython.exe "C:/Users/g1702543/PycharmProjects/untitled/Day12/普通 类 静态方法.py" this is my programs this is my programs None
实例方法(普通方法)———————————————> 随着实例属性的改变而改变
类方法(无论是类调用还是实例调用)————————> 都是类属性的值,不随实例属性的变化而变化
静态方法 —————————————————----—> 不可以访问类属性,故直接输出传入方法的值
【表格总结】