当前位置: 首页 > news >正文

静态属性

  

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

1
2
3
4
5
6
7
8
9
10
11
12
class  Dog( object ):
 
     def  __init__( self ,name):
         self .name  =  name
 
     @property
     def  eat( self ):
         print ( " %s is eating"  % self .name)
 
 
=  Dog( "ChenRonghua" )
d.eat()

调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了

1
2
3
4
5
Traceback (most recent call last):
  ChenRonghua  is  eating
   File  "/Users/jieli/PycharmProjects/python基础/自动化day7面向对象高级/属性方法.py" , line  16 in  <module>
     d.eat()
TypeError:  'NoneType'  object  is  not  callable

正常调用如下

1
2
3
4
5
=  Dog( "ChenRonghua" )
d.eat
 
输出
  ChenRonghua  is  eating

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

1. 连接航空公司API查询

2. 对查询结果进行解析 

3. 返回结果给你的用户

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

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

 

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

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

输出, 说不能更改这个属性,我擦。。。。,怎么办怎么办。。。 

1
2
3
4
5
6
checking flight CA980 status
flight  is  arrived...
Traceback (most recent call last):
   File  "/Users/jieli/PycharmProjects/python基础/自动化day7面向对象高级/属性方法.py" , line  58 in  <module>
     f.flight_status  =   2
AttributeError: can't  set  attribute

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

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")
    
    @flight_status.setter #修改
    def flight_status(self,status):
        status_dic = {
            0 : "canceled",
            1 :"arrived",
            2 : "departured"
        }
        print("\033[31;1mHas changed the flight status to \033[0m",status_dic.get(status) )

    @flight_status.deleter  #删除
    def flight_status(self):
        print("status got removed...")

f = Flight("CA980")
f.flight_status
f.flight_status =  2 #触发@flight_status.setter 
del f.flight_status #触发@flight_status.deleter 

 

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

 

转载于:https://www.cnblogs.com/randomlee/p/9035988.html

相关文章:

  • python常用模块之json、pickle模块
  • 100baseT、100baseFX、1000base-SX、100/1000base-T
  • 【性能测试】脚本开发,最普通的http协议脚本
  • Python中使用SQLite
  • 列表学习总结
  • DB2存储过程——参数详解
  • 克隆虚拟机解决无法访问网络问题
  • oracle数据库rman备份计划及恢复
  • Mongodb查询命令详解
  • Linux CentOS 6.5 使用自带jdk修改环境变量
  • ChromeExtension入门浅谈
  • 一次快速改写 SQL Server 高效查询的范例
  • Scrapy 和 scrapy-redis的区别
  • JavaScript语言精粹读后记录
  • shell编程, 100文钱买100只鸡, 简单实现
  • Linux链接文件
  • PAT A1120
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue组件定义
  • 阿里云Kubernetes容器服务上体验Knative
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 工程优化暨babel升级小记
  • 讲清楚之javascript作用域
  • 前端js -- this指向总结。
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 收藏好这篇,别再只说“数据劫持”了
  • 说说动画卡顿的解决方案
  • 我的业余项目总结
  • 原生 js 实现移动端 Touch 滑动反弹
  • 阿里云移动端播放器高级功能介绍
  • 第二十章:异步和文件I/O.(二十三)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (¥1011)-(一千零一拾一元整)输出
  • (27)4.8 习题课
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (阿里云万网)-域名注册购买实名流程
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ../depcomp: line 571: exec: g++: not found
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 控制台应用程序读取配置文件app.config
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net mvc总结
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 中viewstate的原理和使用
  • .Net中间语言BeforeFieldInit
  • @NestedConfigurationProperty 注解用法
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @vue/cli脚手架
  • [14]内置对象
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大