类方法与静态方法
普通方法:
def fun_name(self,...):
pass
外部用实例调用
静态方法:
@staticmethod
1.不能访问实例属性
2.参数不能传入self
3.与类相关但是不依赖类与实例的方法
类方法:
@classmethod
1.不能访问实例属性
2.参数必须传入cls(代表了此类对象区别于self代表的实例对象),并且还需要用此来调用类属性
cls.类属性名
@classmethod @staticmethod区别
实验一:
class A(object):
x = 20
def foo(self,x):
print(f"x={self.x}") # x=20
print(f"self",self) # self <__main__.A object at 0x0000000002EE9508>
@classmethod
def class_foo(cls,x):
print(f"x={cls.x}") # x=20
print("cls:",cls) # cls: <class '__main__.A'>
@staticmethod
def static_foo(x):
print(f"x={x}") # x=20
a = A()
a.foo(20)
a.class_foo(20)
a.static_foo(20)
实验二:
class A(object):
x = 20
@classmethod
def foo(self,x):
print(f"x={self.x}") # x=20
print(f"self",self) # self <class '__main__.A'>
@classmethod
def class_foo(cls,x):
print(f"x={cls.x}") # x=20
print("cls:",cls) # cls: <class '__main__.A'>
@classmethod
def static_foo(x):
print(f"x={x}")
a = A()
a.foo(20)
a.class_foo(20)
a.static_foo(20) # builtins.TypeError: static_foo() takes 1 positional argument but 2 were given
实验一和实验二对比,发现,@classmethod的使用需要传入self或者cls,否则会报错
实验三:
class A(object):
x = 20
def foo(self,x):
print(f"x={self.x}") # x=20
print(f"self",self) # self <__main__.A object at 0x0000000002E8A548>
def class_foo(cls,x):
print(f"x={cls.x}") # x=20
print("cls:",cls) # cls: <__main__.A object at 0x0000000002E8A548>
@staticmethod
def static_foo(x):
print(f"x={x}") # x=20
a = A()
a.foo(20)
a.class_foo(20)
a.static_foo(20)
实验三发现cls和self起到同样的作用
总结:
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。
类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
普通对象方法至少需要一个self参数,代表类对象实例
类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。
由于静态方法不需要使用self或者cls来实例化属性,所以相对于后两者,前者(静态方法)是比较省内存的
本文详细解析了Python中类方法与静态方法的区别与应用。类方法通过@classmethod装饰器定义,可以访问类属性,参数传入cls;静态方法通过@staticmethod装饰器定义,无法访问实例或类属性,更像独立函数,节省内存。
2531

被折叠的 条评论
为什么被折叠?



