相关概念
1:实例方法
除了静态方法与类方法外,类的其他方法都属于实例方法
实例方法隐含的参数为类实例self
实例方法需要将类实例化后才可以调用,如果使用类直接调用实例方法,需要显示地将实例对象作为参数传入
创建一个类,包含普通方法,静态方法,类方法
class A():
#类属性
sentence = 'this is a learning testing'
#普通方法(实例方法)
def normalMethod(self):
print(self.sentence)
# 类方法
@classmethod
def classMethod(cls,sentence):
print(cls.sentence)
# 静态方法
@staticmethod
def staticMethod(sentence):
print(sentence)
1:实例方法
使用实例调用实例方法:
(1)不改变原始类属性
(2)改变原始类属性
-------1:不改变原始类属性
-------2:改变原始类属性
(2)输出结果:
总结:输出结果随着实例属性改变而改变
2:静态方法
静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。
关于静态方法只需要记住两方面:可以被实例对象和类访问;静态方法直接输出传入方法的值。
------1:实例对象访问静态方法
输出结果:
------2:用类直接访问静态方法
输出结果:
总结:静态方法直接输出传入方法的值
备注:
Python使用静态方法类似函数工具使用,一般尽量少用静态方法。
Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:
1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;
2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;
3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。
3:类方法
类方法可以通过类直接调用,或通过实例直接调用。但无论哪种调用方式,方法隐含的参数为类本身cls。
类方法可以实例化对象和类访问,不随实例属性的变化而变化。
------1:实例对象访问类方法
输出结果:
------2:接用类访问类方法
总结:
1.都是类属性的值,不随实例属性的变化而变化
2. 类方法可以被实例对象和类访问
3. 类成员方法则更接近类似Java面向对象概念中的静态方法
实例方法和类方法区别:
首先形式上的区别,实例方法隐含的参数为类实例self,而类方法隐含的参数为类本身cls。 静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。
所以逻辑上,类方法被类调用,实例方法被实例调用,静态方法两者都能调用。主要区别在于参数传递上的区别,实例方法传递的是self引用作为参数,而类方法传递的是cls引用作为参数。
归纳成一张表:
实例方法(普通方法) | 类方法 | 静态方法 | |
---|---|---|---|
实例调用a=A() | a.normalMethod(x) | a.classMethod(x) | a.staticMethod(x) |
类调用A | 不能调用 | A.classMethod(x) | A.staticMethod(x) |
所以实例方法的权限是最高的,只有实例对象可以访问。
而静态方法,实例对象和类方法都可以访问。
附:
(1)Python:类的继承,调用父类的属性和方法基础详解
(2)Python类的实例化,封装,继承,私有变量和私有方法