来源:python中国网 时间:2019-06-06

  属性方法的作用就是通过@property把一个方法变成一个静态属性(类属性)

# ‐*‐ coding: utf‐8 ‐*‐

class Student(object):

    def __init__(self, name):
        self.name = name

    @property
    def info(self):
        print("我是{0}".format(self.name))

f = Student("老王")
f.info  # 不需要加括号了
D:installpython3python.exe D:/pyscript/test/test2.py
我是老王

Process finished with exit code 0


  把一个方法变成类属性有什么呢?为何不直接定义一个类变量?为何要多此一举?一个事物的诞生总是有实际场景的,比如你有个数据迁移项目需要查看状态。你可以定义一个属性用来存储状态,但是如果用property会更便捷,因为查看状态需要一系列动作:登陆机器、连接数据库、查看数据等。你可以写一个功能函数在里面一顿操作返回状态,然后在一个函数内部调用这个功能函数的结果返回具体信息。

# ‐*‐ coding: utf‐8 ‐*‐

class SyncJob(object):

    def __init__(self,name):
        self.name = name

    def process_need(self):
        print("{0}登陆机器".format(self.name))
        print("{0}连接数据库".format(self.name))
        print("{0}查看数据".format(self.name))
        return  1

    @property
    def status(self):
        status = self.process_need()
        if status == 0 :
            print("没网,连不上机器")
        elif status == 1 :
            print("数据同步完成")
        else:
            print("数据库链接出错")

f = SyncJob("老王")
f.status
D:installpython3python.exe D:/pyscript/test/test.py
老王登陆机器
老王连接数据库
老王查看数据
数据同步完成

Process finished with exit code 0


  如何更改属性

  并非直接赋值,需要通过@proerty.setter装饰器再装饰一下,需要写一个新方法。

# ‐*‐ coding: utf‐8 ‐*‐

class SyncJob(object):

    def __init__(self,name):
        self.name = name

    def process_need(self):
        print("{0}登陆机器".format(self.name))
        print("{0}连接数据库".format(self.name))
        print("{0}查看数据".format(self.name))
        return  1

    @property
    def status(self):
        status = self.process_need()
        if status == 0 :
            print("没网,连不上机器")
        elif status == 1 :
            print("数据同步完成")
        else:
            print("数据库链接出错")

    @status.setter  # 修改
    def status(self, status):
        status_dic = {
            0: "okokok",
            1: "nonono",
            2: "出事了"
        }
        print("修改了属性",status_dic.get(status))

f = SyncJob("老王")
f.status
f.status = 2
D:installpython3python.exe D:/pyscript/test/test.py
老王登陆机器
老王连接数据库
老王查看数据
数据同步完成
修改了属性 出事了

Process finished with exit code 0