python中的class_static的@classmethod的使用
classmethod的使用,主要针对的是类而不是对象,在定义类的时候往往会定义一些静态的私有属性,但是在使用类的时候可能会对类的私有属性进行修改,但是在没有使用class method之前对于类的属性的修改只能通过对象来进行修改,这是就会出现一个问题当有很多对象都使用这个属性的时候我们要一个一个去修改对象吗?答案是不会出现这么无脑的程序,这就产生classmethod的妙用。请看下面的代码:
classGoods:
__discount=0.8def__init__(self,name,money):
self.__name= name
self.__money= money@propertydefprice(self):return self.__money*Goods.__discount@classmethoddefchange(cls,new_discount):#注意这里不在是self了,而是cls进行替换
cls.__discount= new_discount
apple= Goods('苹果',5)print(apple.price)
Goods.change(0.5)#这里就不是使用apple.change()进行修改了print(apple.price)
上面只是简单的列举了class method的一种使用场景,后续如果有新的会持续更新本篇文章
2.既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢
从它们的使用上来看,
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
下面上代码。
classA(object):
bar=1deffoo(self):print'foo'@staticmethoddefstatic_foo():print'static_foo'print A.bar@classmethoddefclass_foo(cls):print'class_foo'print cls.bar
cls().foo()###执行
A.static_foo()
A.class_foo()