欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python的类方法与静态方法细节讲解,中文理解与例子

程序员文章站 2022-05-18 20:25:07
classmethod(类函数)与 staticmethod(静态函数)外行人理解为:静态方法是类方法他祖先...

classmethod(类函数)与 staticmethod(静态函数)

classmethod和staticmethod的使用情况:

python中的类也是普通对象,如果想在为创建实例就使用这个类:如将类作为参数传递到其他函数中。又希望在实例化之前这个类之前就能提供某些方法。就可以使用classmethod和staticmethod。

classmethod优点

  1. 可以判断自己是通过基类被调用,还是通过子类被调用。
  2. 通过子类调用时,方法返回子类的实例而非基类的实例。
  3. 通过子类调用时,方法可以调用子类的其他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