# -*- 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. 从「王师傅一共损失了多少钱」说开去
  2. 计算机课代表自荐信,课代表自荐信范文
  3. 趣链 BitXHub跨链平台 (7)应用链插件
  4. C++中的sort函数对二维数组排序是按照什么准则?
  5. oracle 11g exp 报错 EXP-00056;ORA-12154;EXP-00000;
  6. ssh-add - 向认证代理添加 RSA 或 DSA 身份数据
  7. 用户增长 - BG/NBD概率模型预测用户生命周期LTV(二)
  8. 【百度地图-安卓SDK】从头开始写android程序
  9. udpSocket捕获ICMP不可达错误
  10. 【备战秋招系列-3】Java高频知识点——排序、设计模式、JavaSE、JVM
  11. FTP超详解及搭建步骤
  12. 服务器2003系统无故重启,2003服务器自动重启
  13. Retrofit 2.9.0 源码解析
  14. 获取公众号关注页面链接
  15. python win32gui使用_python win32 简单操作
  16. UCASE() 函数
  17. linux ssh su - 区别,su 与 su -区别
  18. c语言中换行符与回车符的区别,C语言中换行符与回车符的区别
  19. 云收藏系统|基于Springboot实现云收藏系统
  20. CodeKK源码地址

热门文章

  1. se是什么职位_女皇大学PSE&SE 独家解析!
  2. hive 行转列和列转行的方法_面试常考!SQL行转列和列转行
  3. 判断html()中有长度,VBS 字符串长度判断的问题
  4. 实战 es6_腾讯云 Elasticsearch 实战篇(二十二) ES6.8权限使用配置
  5. HTML+CSS+JS实现 ❤️canvas手机刮刮乐女朋友效果❤️
  6. python做词典_Python实现创建字典
  7. matlab melbankm,Matlab v_melbankm函数参数详解(英文附例)
  8. Android测量图像中物体大小,android – 加载图像后测量ImageView
  9. 计算机大赛横幅标语有趣的,有趣的横幅标语
  10. 爬虫必备反爬技能:使用动态ip