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

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

 


 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值