# -*- coding:utf-8 -*-
#在看廖雪峰的python3.5教学时,看到面向对象高级编程_定义类
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319098638265527beb24f7840aa97de564ccc7f20f6000
百度了很久没有找到想要的答案,想了很久,总结了一点点心得,写的不好,希望大家指正
途中发现好多问题,包括前面没有理解的,停留了好久
##################################
#正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。比如定义Student类:class Student(object):def __init__(self):self.name = 'Michael'#调用name属性,没问题,但是,调用不存在的score属性,就有问题了:
#>>> s = Student()
#>>> print(s.name)
#Michael
#>>> print(s.score)
#Traceback (most recent call last):
#  ...
#AttributeError: 'Student' object has no attribute 'score'#错误信息很清楚地告诉我们,没有找到score这个attribute。
#要避免这个错误,除了可以加上一个score属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性。修改如下:class Student(object):def __init__(self):self.name = 'Michael'def __getattr__(self, attr):if attr=='score':return 99#当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score的值:#>>> s = Student()
#>>> s.name
#'Michael'
#>>> s.score
#99#返回函数也是完全可以的:class Student(object):def __getattr__(self, attr):if attr=='age':return lambda: 25#只是调用方式要变为:
#>>> s.age()
#25#注意,只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如name,不会在__getattr__中查找。#此外,注意到任意调用如s.abc都会返回None,这是因为我们定义的__getattr__默认返回就是None。要让class只响应特定的几个属性,我们就要按照约定,抛出AttributeError的错误:class Student(object):def __getattr__(self, attr):if attr=='age':return lambda: 25raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)#这实际上可以把一个类的所有属性和方法调用全部动态化处理了,不需要任何特殊手段。#这种完全动态调用的特性有什么实际作用呢?作用就是,可以针对完全动态的情况作调用。#举个例子:#现在很多网站都搞REST API,比如新浪微博、豆瓣啥的,调用API的URL类似:#http://api.server/user/friends
#http://api.server/user/timeline/list
#如果要写SDK,给每个URL对应的API都写一个方法,那得累死,而且,API一旦改动,SDK也要改。#利用完全动态的__getattr__,我们可以写出一个链式调用:class Chain(object):def __init__(self, path=''):self._path = pathdef __getattr__(self, path):return Chain('%s/%s' % (self._path, path))def __str__(self):return self._path__repr__ = __str__#测试结果
#>>> Chain().status.user.timeline.list
#'/status/user/timeline/list'#==========================================
#这里想了很久;查看一个类
#创建了一个空的类,再创建一个实例实例class Student(object):pass#bart = Student()
#变量bart指向的就是一个Student的实例#再看刚刚那个例子,Chain()表示类自己(本身);
#Chain().status表示的类Chain()的status属性,此时函数就去寻找Chain的status属性
#但发现没有此属性,这时特殊函数__getattr__起作用了,它帮我们创建属性status属性
#根据定义的方法将新的属性前加一个'/'#初始化使用了默认参数path为空
#def __init__(self, path=''):#连贯起来就是
#1.先定义类Chain()的一个属性path,切默认值为'',为空
#2.定义方法,特殊函数__getattr__遇到未定义的属性默认返回空,不报错
#由于定义了方法,所以返回return Chain('%s/%s' % (self._path, path))
#即将未定义的额属性以'/'为分隔符输出
#3.方法def __str__(self):的作用是打印字符串#当然还有细节没有搞清楚
#1.class中的各方法参数是表示同一个值吗?
#即三个方法中的self._path相关么?

转载于:https://www.cnblogs.com/irockcode/p/7828737.html

__getattr__动态获取接口相关推荐

  1. vue动态获取接口域名

    域名一般是打包到项目里面的,打包后不能动态配置,只能通过不同的指令来动态切换域名. 后台说增加一个配置文件,动态更改域名.查了查网上,现记录下步骤. 1.安装插件 npm install --save ...

  2. vue 获取动态域名_vue项目接口域名动态获取操作

    需求: 接口域名是从外部 .json 文件里获取的. 思路: 在开始加载项目前 进行接口域名获取,然后重置 接口域名的配置项. 实现: 1.config/index.js 文件 进行基础配置 impo ...

  3. java 获取所有实现类_Java动态获取实现某个接口下所有的实现类对象集合

    Java动态获取实现某个接口下所有的实现类对象集合 最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这 ...

  4. ajax怎样获得表头信息,layui.table动态获取表头和列表数据示例

    layui.table动态获取表头和列表数据示例 2020年07月14日 | 萬仟网IT编程 | 我要评论 ```javascript//表格layui.use('table', function() ...

  5. 深入理解java注解,java的4个元注解,注解三要素——定义、使用及读取执行,深入了解注解的底层本质,通过反射自动、动态获取注解所有属性以及属性值

    1. 注解的定义 注解也是一种引用类型,编译后会生成 .class 字节码文件,作用就是为程序进行标识,不同注解能实现不同功能. 2. 注解的使用 3. 注解的读取执行 3.1 得不到注解信息,得到的 ...

  6. Postman调用阿里云HTTPS动态注册接口(一型一密)

    按照阿里云文档: 请求方式:post 地址格式: https://iot-auth.cn-shanghai.aliyuncs.com/auth/register/device 如下图写入参数: sig ...

  7. 微信小程序view动态长度_微信小程序实现动态获取元素宽高的方法分析

    本文实例讲述了微信小程序实现动态获取元素宽高的方法.分享给大家供大家参考,具体如下: 我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuer ...

  8. 【瑞芯微Rockchip Linux平台】SoftAp需求实现(3)动态获取BT Mac地址并更新beacon帧中的mac信息

    [瑞芯微Rockchip Linux平台]SoftAp需求实现(3)动态获取BT Mac地址并更新beacon帧中的mac信息 1. 获取本机的蓝牙mac地址 __get_bt_mac_addr() ...

  9. Android通过反射EthernetManager Api设置以太网为静态IP地址或者动态获取IP

    一.对于一些工控行业的Android主板一般都会扩展个以太网接口,也就是可以插网线进行上网:然后在系统设置页面有个以太网菜单可以进行IP.网关等设置,如下: 二.那怎么通过代码去设置呢? 1.Andr ...

最新文章

  1. NDC 2010视频下载:看看其他微软平台程序员们都在做什么
  2. scala 定义空的list_18.scala的型变
  3. 科大星云诗社动态20201223
  4. Apache Ignite的Node.js客户端使用入门
  5. poj1673 EXOCENTER OF A TRIANGLE
  6. laravel 服务提供者
  7. CV Code|计算机视觉开源周报20200501期
  8. 盈利靠涨价、广告满屏飞,共享充电宝入局容易做大难
  9. Python 3.x对MySQL数据库的常用操作
  10. Ubuntu 12.10安装配置JDK7环境
  11. SQL—数据模型的组成要素
  12. 《程序员》: Andrew Ng谈Deep Learning
  13. C# 连接Access数据库
  14. 5s管理推进的三个阶段及三大实施原则
  15. U盘无法打开的解决方法大全
  16. 剑指offer算法题分析与整理(二)
  17. 服务器接上显示器后没信号,为什么显示器无信号电脑显示器无信号的解决办法...
  18. STATA面板数据模型进行Hausman检验
  19. Android设备虚拟摄像头技术实现
  20. JFS 文件系统概述及布局分析

热门文章

  1. MySql主从同步最小配置
  2. 哲学家就餐问题python_哲学家就餐-同步问题解析-python
  3. oracle安装后开机很慢,Windows下安装Oracle拖慢开机速度的解决方法
  4. (BFS)Catch That Cow(poj3278)
  5. (二分搜索法尺取法)subsequence
  6. Windows远程文件拷贝openEuler--WinSCP
  7. HTML+CSS+JS实现 ❤️酷炫HUD科幻数据屏幕动画界面❤️
  8. HTML+CSS+JS实现 ❤️echarts企业地区大数据图表模板❤️
  9. 看门狗性能软件测试,《看门狗:军团》PC版性能测试 不建议光追,优化极差
  10. ubuntu mysql支持中文_ubuntu (16.04) server 英文原版 添加中文语言支持 消除java 程序、mysql 数据库不能处理中文的错误...