python中classmethod 和 staticmethod 异同点

引用翻译: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

猜你喜欢

转载自blog.csdn.net/qq_35515661/article/details/81252173
今日推荐