python3之路 基础-静态方法、类方法、属性方法

在python3中一些有高级语法,今天简单介绍一下

  • @staticmethod
    静态方法
  • @classmethod
    类方法
  • @property
    属性方法

@staticmethod【静态方法】

通过@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【类方法】

类方法通过@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

属性方法的作用就是通过@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

你可能感兴趣的:(python)