python的类方法与静态方法细节讲解,中文理解与例子
程序员文章站
2022-05-18 20:25:07
classmethod(类函数)与 staticmethod(静态函数)外行人理解为:静态方法是类方法他祖先...
classmethod(类函数)与 staticmethod(静态函数)
classmethod和staticmethod的使用情况:
python中的类也是普通对象,如果想在为创建实例就使用这个类:如将类作为参数传递到其他函数中。又希望在实例化之前这个类之前就能提供某些方法。就可以使用classmethod和staticmethod。
classmethod优点
- 可以判断自己是通过基类被调用,还是通过子类被调用。
- 通过子类调用时,方法返回子类的实例而非基类的实例。
- 通过子类调用时,方法可以调用子类的其他classmethod
额外知识
__new__的特殊之处在于他永远是一个实质上的classmethod(准确来说staticmethod,第一个参数需要手工传递cls)
类方法
class Class_func(object):
num = 100
def __init__(self, cl):
print('构造函数执行了吗')
self.cl = cl
@classmethod
def get(cls, da):
print('传入数据为{}'.format(da))
print(cls.num, '在静态输出类属性')# 这里说明类方法可以调用类自身的属性
return '既然是方法当然有返回值啊'
print(Class_func.num, '类自身的属性')
print(Class_func.get('1314'), '传入类方法后的属性')
entity_class = Class_func('1315')
print(entity_class.cl,'创建实例后调用实例属性')
print(entity_class.num, '创建实例后,实例调用类属性')
print(entity_class.get('实例传入'), '创建实例后,实例调用类方法')
#########################
输出结果
100 类自身的属性
传入数据为1314
100 输出类属性
既然是方法当然有返回值啊 传入静态方法后的属性
构造函数执行了吗
1315 创建实例后调用实例属性
100 创建实例后,实例调用类属性
传入数据为实例传入
100 输出类属性
既然是方法当然有返回值啊 创建实例后,实例调用静态方法
从结果得结论
1.在类方法中使用类本身,可以先调用类自身的属性
2.使用类本身可以调用类方法,在类方法中也可以调用类自身的属性
3.在 类方法中不能使用实例的属性和方法,但可以使用类自身的的属性
4.实例可以调用类自身的属性
5.实例可以调用静态方法,也可传参给类方法。(这句可能绕口,实例可以调用类方法,类方法不可以调用实例。在数学中的概念———充分条件,不是充分必要)
静态方法
class Static_func(object):
num = 10
def __init__(self, st):
print('构造函数执行了吗')
self.st = st
@staticmethod
def get(da):
print('传入数据为{}'.format(da))
return '既然是方法当然有返回值啊'
print(Static_func.num,'类自身的属性')
print(Static_func.get('1212'),'调用类方法')
entity = Static_func('1213')
print(entity.num,'实例调用类属性')
print(entity.st,'实例调用构造的属性')
print(entity.get('1214'),'实例调用静态方法')
##################
输出
10 类自身的属性
传入数据为1212
既然是方法当然有返回值啊 调用类方法
构造函数执行了吗
10 实例调用类属性
1213 实例调用构造的属性
传入数据为1214
既然是方法当然有返回值啊 实例调用静态方法
从结果得结论
1.类自身可调用,类本身的类属性(这点和静态方法一致)
2.使用类自身可直接调用静态方法(注意类方法中是不传self和cls的)
3.既然没有传self和cls那就说明静态方法中 是不可以调用创建类的属性(方法)和实例的属性(方法)的
4.实例可以调用类属性
5.实例调用静态方法
最终结果
静态方法是类方法更 底层的实现,
在静态方法中传入cls(类自身)也就是类方法了
本文地址:https://blog.csdn.net/weixin_43883666/article/details/107363083