@staticmethod和@classmethod的共同特点:
使用这两个,就可以不需要实例化,直接类名.方法名()来调用
@staticmethod和@classmethod的区别:
(1)@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
(2)@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
class A(object):
# 属性默认为类属性(可以给直接被类本身调用)
num = "实例化"
num2 = "class不需要实例化"
num3="static不需要实例化"
def foo(self):
return "你好呀"
# 实例化方法(必须实例化类之后才能被调用)
def func1(self): # self : 表示实例化类后的地址id
return self.num
# 类方法(不需要实例化类就可以被类本身调用)
@classmethod
def func2(cls): # cls : 表示没用被实例化的类本身
return cls.num2,cls().foo()
@staticmethod
def func3():
return A.num3,A().foo()
aa = A().func1()
print(aa)
bb = A.func2()
print(bb)
cc = A.func3()
print(cc)
运行结果:
常见报错信息:
missing 1 required positional argument: ‘self’
其实就是忘记实例化了,上述例子调用类A里面的方法之前,没有对类进行实例化
错误示范:aa=A.func1()
正确写法:aa=A().func1()