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