类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
class Dog:
name = "狗爷"
# 类方法
@classmethod
def eat2(cls):
print("dog %s is eating..." % cls.name)
Dog.eat2()
dog.eat2()
输出
dog 狗爷 is eating...
dog 狗爷 is eating...
静态方法
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
class Dog:
name = "狗爷"
# 静态方法
@staticmethod
def eat3():
print("Dog")
Dog.eat3()
dog.eat3()
输出
Dog
Dog
属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性
class Dog:
name = "狗爷"
def __init__(self, name):
self.name = name
def eat(self):
print("dog %s is eating..." % self.name)
# 属性方法
@property
def eat4(self):
print("dog %s is eating..." % self.name)
@eat4.setter
def eat4(self, status):
print("dog", status)
@eat4.getter
def eat4(self):
return self.name
@eat4.deleter
def eat4(self):
print("删除")
dog = Dog("小黑")
dog.eat4
dog.eat4 = "已吃完"
print(dog.eat4)
del dog.eat4
输出
dog 已吃完
小黑
删除
注意当存在getter方法时,调用属性方法其实就是执行getter方法
当不存在getter方法时,调用属性犯法才是执行属性本身的方
使用场景
好吧,把一个方法变成静态属性有什么卵用呢?既然想要静态变量,那直接定义成一个静态变量不就得了么?well, 以后你会需到很多场景是不能简单通过 定义 静态属性来实现的, 比如 ,你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步:
-
连接航空公司API查询
-
对查询结果进行解析
-
返回结果给你的用户
因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以,明白 了么?
总觉得跟Vue中的computed属性有点像