• Python-面向对象高级语法之属性方法


    属性方法

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

    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        @property
        def eat(self):
            print(" %s is eating" %self.name)
     
     
    d = Dog("Tom")
    d.eat()
    

       调用时会报错,提示TypeError: 'NoneType' object is not callable。因为eat此时已经变成一个静态属性了,不是一个方法。想调用已经不需要加()号,直接使用d.eat即可。

    正常调用如下:

    # _*_ coding:utf-8 _*_
    
    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @property
        def eat(self):
            print(" %s is eating" % self.name)
    
    
    d = Dog("Tom")
    # d.eat()
    d.eat
    

       把一个方法变成静态属性有什么卵用呢?既然想要静态变量,那直接定义成一个静态变量不就得了么?well, 以后你会需到很多场景是不能简单通过 定义静态属性来实现的, 比如 ,你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步:

    1. 连接航空公司API查询
    2. 对查询结果进行解析
    3. 返回结果给你的用户

    因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以,明白了么?伪代码如下:

    # _*_ coding:utf-8 _*_
    
    
    class Flight(object):
        def __init__(self,name):
            self.flight_name = name
    
        def checking_status(self):
            print("checking flight %s status " % self.flight_name)
            return 1
    
        @property
        def flight_status(self):
            status = self.checking_status()
            if status == 0 :
                print("flight got canceled...")
            elif status == 1 :
                print("flight is arrived...")
            elif status == 2:
                print("flight has departured already...")
            else:
                print("cannot confirm the flight status...,please check later")
    
    
    f = Flight("CA980")
    f.flight_status
    

    现在我只能查询航班状态, 既然这个flight_status已经是个属性了, 那我能否给它赋值呢?试试吧。

    f = Flight("CA980")
    f.flight_status
    f.flight_status =  2
    

    执行后提示AttributeError: can't set attribute,无法设置属性。

    当然可以改, 不过需要通过@proerty.setter装饰器再装饰一下,此时 你需要写一个新方法, 对这个flight_status进行更改。

    注意以上代码里还写了一个@flight_status.deleter, 是允许可以将这个属性删除。

  • 相关阅读:
    nginx 启用php解析及解决无法访问报错Primary script unknown的过程
    百度云服务器连接码云的坑
    async函数测试
    centos6.8安装mysql5.7及用navicat远程连接
    JavaScript模块知识理解
    为什么if else 语句里不能用函数声明定义函数,而可以用函数表达式定义函数
    Java8-对map过滤
    git cherry-pick 的使用
    Java8-对map排序
    Java8过滤器(Filter)
  • 原文地址:https://www.cnblogs.com/kirusx/p/6974092.html
Copyright © 2020-2023  润新知