引用翻译:https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner
类方法向下继承解释:类方法调用可以用实例也可以用类名,同理,其参数必须有cls(类),可以有self(实例对象)
静态方法不同之处在于:类的静态方法参数不做限制(可以使用self作为参数)
实例化对象使用属性时,优先访问实例属性;而实例化对象访问方法时,优先访问类方法和静态方法,没有的话再在实例化方法中寻找。
用法搬运(自 stack overflow):
'''
在实例化前使用类方法解决格式冲突问题
'''
class Person(object):
name = 'yangyong'
def __init__(self,nian,yue,ri):
self.nian = nian
self.yue = yue
self.ri =ri
print(self.nian)
print(self.yue)
print(self.ri)
@classmethod
def translate1(cls,str1):
a,b,c = map(int,str1.split('-'))
return Person(a,b,c)
@staticmethod
def translate2(str1):
a,b,c = map(int,str1.split('-'))
return Person(a,b,c)
if __name__ == '__main__':
a = '2018-07-27' #类实例默认接受 2018 07 27 通过类方法 成功直接使用a这种样式
Person.translate1(a)
Person.translate2(a)
#结果:
2018
7
27
2018
7
27
实战2:
'''
@staticmethod @classmethod
静态方法 类属性
'''
class Person(object):
name = 'CLSNAME'
def __init__(self,name):
self.name = name
def tell(self):
print('tell' + self.name)
@classmethod #self 和 class 都能访问到,cls为必选参数
def say(cls,self,a = 777):
print(cls.name + self.name + str(a))
@classmethod
def say1(cls,a=888):
print(cls.name + str(a))
@staticmethod #self 和 class 都能访问到,不需要cls类参数
def talk(self,a = 999):
print(self.name + str(a) + Person.name)
if __name__ == '__main__':
Person('AAA').say(Person('BBB')) #CLSNAMEBBB777
Person.say(Person('CCC')) #CLSNAMECCC777
Person('DDD').say1() #CLSNAME888
Person.say1() #CLSNAME888
Person('EEE').talk(Person('FFF')) #FFF999CLSNAME
Person.talk(Person('GGG')) #GGG999CLSNAME