Python面向对象——静态属性,类方法,静态方法

静态属性:@property
类方法:@classmethod
静态方法:@staticmethod
都是在定义class类内部的功能属性添加装饰器来达到另外一个效果。web

静态属性的做用:@property加到功能属性开头,使的功能属性的调用方式和调用静态属性的方式相同。
没有加@property的调用方式以下:svg

class Person:
	country = "中国"
	def __init__(self, name, age, sex):
		self.name = name
		self.age = age
		self.sex = sex
	def sleep(self):
		return "{}正在吃饭".format(self.name)
		
# 此时调用sleep方法
p1 = Person("小明", 18, "男")
print(p1.sleep())
# 调用数据属性的方法
print(p1.name)

当在sleep方法加上@property装饰器后的调用方法:函数

class Person:
	country = "中国"
	def __init__(self, name, age, sex):
		self.name = name
		self.age = age
		self.sex = sex
	@property
	def sleep(self):
		return "{}正在吃饭".format(self.name)
		
# 此时调用sleep方法
p1 = Person("小明", 18, "男")
print(p1.sleep)
# 调用数据属性的方法
print(p1.name)
#此时调用sleep的方法和调用静态属性的方法相同,@property的功能就是将类内部功能属性的调用方式和静态属性的调用方式达到一致的功能。

类方法的做用:通常状况下类里面定义的功能属性想要调用就必须先将类实例化,而后才能调用,将@classmethod加到功能属性的前面,这样能够在不实例化的状况下用类直接调用。
没有加@classmethod装饰器的sleep的调用方式code

class Person:
	country = "中国"
	def __init__(self, name, age, sex):
		self.name = name
		self.age = age
		self.sex = sex
	
	def sleep(self):
		return "{}正在吃饭".format(self.name)

# 此时想要调用sleep功能属性就必须先将Person类实例化,而后才能调用。
p1 = Person("小明", 18, "男")
#第一种调用方式
print(p1.sleep())
#第二种调用方式
print(Person.sleep(p1))

加了@classmethod后sleep的调用方式orm

class Person:
	country = "中国"
	def __init__(self, name, age, sex):
		self.name = name
		self.age = age
		self.sex = sex
	@classmethod
	def sleep(cls, x):
		return "{}正在吃饭".format(x)  #加完@classmethod后sleep功能属性的参数将变成cls

# 此时调用sleep功能属性将不用将类实例化,直接用类名就能够调用
print(Person.sleep("小明"))

静态方法:@staticmethod
静态方法的做用:在类里面的功能加上@staticmethod,将把加上装饰器的功能属性独立出来,至关存在于类里面的独立的函数,参数不用加上self和cls.xml

class Person:
	country = "中国"
	def __init__(self, name, age, sex):
		self.name = name
		self.age = age
		self.sex = sex
	@staticmethod
	def sleep(x):
		return "{}正在吃饭".format(x)  #加完@classmethod后sleep功能属性的参数将不用加self 和cls,  此时将不能调用类的属性以及实例属性,至关于独立出来的个体函数

p1 = Person("小明", 18, "男")
# 此时调用sleep功能属性
print(Person.sleep("小明"))
print(.sleep("小明"))

总结:静态属性:@property 和类以及实例化都有关系,将功能属性装饰成静态属性
类方法:@classmethod 和类有关系,和实例化脱离关系,不须要实例化也能够调用功能属性
静态方法:@staticmethod 和类以及实例化都没有关系,至关于在类里面存在的独立的个体功能属性。it