zoukankan      html  css  js  c++  java
  • 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, 是允许可以将这个属性删除。

  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/kirusx/p/6974092.html
Copyright © 2011-2022 走看看