参考定义:
class A(object):
X = 1
#实例方法
def foo(self):
print("normal func")
#类方法
@classmethod
def class_foo(cls):
print("class func, X = {}".format(cls.X))
#静态方法
@staticmethod
def static_foo():
print("static func, X = {}".format(A.X))
class B(A):
X = 2
def foo1(self):
print("normal func1")
#@staticmethod
#def static_foo():
# print("static func, X = {}".format(B.X))
说明:
- 实例方法直接定义,第一个参数为self,实例方法不能调用类的类属性
- 类方法用@classmethod装饰,第一个参数为cls
- 静态方法用@staticmethod装饰,不需要额外参数
调用结果:
a = A()
a.foo() #normal func
A.foo(a) #normal func
a.class_foo() #class func, X = 1
A.class_foo() #class func, X = 1
a.static_foo() #static func, X = 1
A.static_foo() #static func, X = 1
b = B()
b.foo() #normal func
B.foo(b) #normal func
b.class_foo() #class func, X = 2
B.class_foo() #class func, X = 2
b.static_foo() #static func, X = 1(如果覆盖父类方法,则输出2,貌似显而易见....)
B.static_foo() #static func, X = 1(如果覆盖父类方法,则输出2,貌似显而易见....)
结果说明:
- 实例方法通常只能用类的实例来调用,但是也可以用类名调用(将类的实例作为参数)
- 类方法和静态方法都既可以用类名也可以用实例调用
- 实例方法,类方法和静态方法都可以继承和覆盖,类方法的cls参数会调用继承类的类属性(如果有)
参考连接:
https://www.cnblogs.com/flypig258/p/11428500.html
https://www.cnblogs.com/dogecheng/p/11441088.html
https://blog.csdn.net/weixin_39622628/article/details/111459880