深入浅出带你理解静态方法和类方法的区别

class A():

    x1 = 3

    def __init__(self):
        self.num = 1

    @ staticmethod
    def test1():
        print("这里是静态方法输出")
        print(A().num) # 静态方法调用实例属性,类属性,类方法都需要 类名()  # 这种属于实例一个对象调用的,静态方法在定义上是不能调用实例属性实例属性,类属性,类方法
        print(A().x1)
        # A().test2()

    @classmethod
    def test2(cls):
        print("这里是类方法输出")
        print(cls().num) # 类方法调用实例属性需要cls()  # 这种属于实例一个对象调用的,类方法在定义上是不能调用实例属性
        print(cls.x1)  # 类方法调用类属性和函数都只用cls.
        # cls.test1()


class B(A):
    pass



a = A()

b = B()

B.test1()# 静态方法可以直接用类名访问,方便调用,一般都是和类有相同功能,但是也可以脱离类独立存在的方法,这种避免了写硬代码,比如一些计算功能就可以用静态方法
b.test2()

del A #  删除A的引用之后,运行报错的是静态方法,类方法依然可以运行,B调用依然是一样的,所以在继承上父类使用类方法程序能更稳定。

a.test2()
A.test1()

 

关于静态方法在继承上的一些理解:

static是静态的。特点是在类被装载时最先开辟内存空间,而且无论类被实例化多少次都只开辟一次内存空间。他本身与能否继承没有关系。

子类不能覆盖父类的static 方法,当在子类中有一个和父类 同名 同参数类型 的方法时,调用子类的这个方法 运行的是子类的方法原因在于引用改变,而子类没有相似方法时调用的是父类的方法,原因也同样在于子类”继承“了父类的这个方法(其实只是引用父类的方法),当自己“重写”方法是隐藏了对父类静态方法的引用。

 


 

发布了30 篇原创文章 · 获赞 70 · 访问量 17万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览