在python3中一些有高级语法,今天简单介绍一下
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个。
class Demo(object):
@staticmethod
def func_statc():
print("我是静态方法")
@staticmethod
def func_statc2(str):
print("我是静态方法--%s" % str)
# 使用方法
Demo.func_statc() #我是静态方法
Demo.func_statc2("参数") #我是静态方法--参数
可以看出来,他的调用方法很简单,直接用【实例名称】调用【静态方法名称】既可以。
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
class Demo(object):
name = 'GPF'
def __init__(self, name):
self.name = name
@classmethod
def eat(cls):
print("%s is eating" % cls.name)
# 使用方法
demo = Demo("lzb")
demo.eat() # GPF is eating
在构造函数总有一个name变量【实例变量】,在class下面还有一个name【类变量】,在我们使用@classmethod时,类方法中不会访问实例变量,它只会访问类变量!
属性方法的作用就是通过@property把一个方法变成一个静态属性
class Demo(object):
name = 'GPF'
def __init__(self, name):
self.name = name
@property
def eat(self):
self.name
print(" %s is eating" % self.name)
# 使用方法
demo = Demo("lzb")
demo.eat # lzb is eating
这里边我们可以发现,在调用eat方法的时候,没有使用"eat()",这是因为eat已经变成了一个属性。我们直接实例化类后调动即可。
使用场景:
当我们要查询一个程序的状态。
class Project(object):
def __init__(self, name):
self.name = name
def __check_status(self):
print("Checking project %s status" % self.name)
return 1
@property
def project_status(self):
state = self.__check_status()
if state == 0:
print("%s is stop" % self.name)
elif state == 1:
print("%s is running" % self.name)
elif state == 2:
print("%s is Unknown state" % self.name)
# 使用方法
project = Project("Demo")
project.project_status #Checking project Demo status
#Demo is running
作为一个属性,我们可以得到值,当然我们也可以赋值、删除。
class Project(object):
def __init__(self, name):
self.name = name
def __check_status(self):
print("Checking project %s status" % self.name)
return 1
@property
def project_status(self):
state = self.__check_status()
if state == 0:
print("%s is stop" % self.name)
elif state == 1:
print("%s is running" % self.name)
elif state == 2:
print("%s is Unknown state" % self.name)
@project_status.setter
def project_status(self, status):
status_dic = {
3: "kill",
4: "start",
5: "restart"
}
print("\033[31;1mThe %s is %s\033[0m" % (self.name, status_dic.get(status)))
@project_status.deleter
def project_status(self):
print("%s initing..." % self.name)
# 使用方法
project = Project("Demo")
project.project_status
project.project_status = 5
del project.project_status