Python自省函数getattr的用法
首先把官方文档搬出来:
英文棒的小伙伴们最好是去看下官方文档,毕竟原汁原味的英文表述才最准确。
Python3.6 getattr 官方文档
getattr()函数是Python自省的核心函数,可以把一个要访问的变量或方法,通过字符串的形式传递过去并拿到返回的值。
获取对象引用getattr
getattr用于返回一个对象属性,或者方法
示例代码:
class Demo: def __init__(self): self.name = 'allen' self.age = '18' def method_one(self): print("这是 method_one 方法") return "one" def method_two(self): print("这是 method_two 方法") d = Demo() # 如果d对象中有属性name则打印self.name的值,否则打印'not find' print(getattr(d, 'name', 'not found')) # 如果d对象中有属性name则打印self.age的值,否则打印'not find' print(getattr(d, 'age', 'not found')) # 如果有方法method_one,打印其地址,否则打印default print(getattr(d, 'method_one', 'default')) # 如果有方法method_one,运行函数并打印返回值,否则,打印default print(getattr(d, 'method_one', 'default')()) # 如果有方法method,运行函数并打印None否则打印default print(getattr(d, 'method_two', 'default')())
解释一下上图的示例代码:
定义一个Demo
类,有两个变量name
和age
,还有两个方法method_one
和method_two
。method_one
方法打印一句话并返回one
这个字符串;method_two
方法打印一句话没有任何返回值;
print(getattr(d, 'name', 'not found'))
:
获取d对象的name属性,如果name属性没有,返回not found。
运行结果:allen
print(getattr(d, 'age', 'not found'))
:
获取d对象的age属性,如果age属性没有,返回not found。
运行结果:not found
print(getattr(d, 'method_one', 'default'))
:
获取d对象的method_one方法的地址,如果method_one方法没有,返回default。
运行结果:<bound method Demo.method_one of <__main__.Demo object at 0x10cbcb9e8>>
print(print(getattr(d, 'method_one', 'default')())
:
获取d对象的method_one方法并运行,且打印返回值。如果method_one方法没有,返回default。
运行结果:这是 method_one 方法
one
print(getattr(d, 'method_two', 'default')())
:
获取d对象的method_two方法并运行,且打印返回值。如果method_two方法没有,返回default。
运行结果:这是 method_one 方法
None
。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用Sublime text 3打造一个小巧但强大的Go语言开发IDE
使用Sublime text 3打造一个小巧但强大的Go语言开发IDE 最近在学习GO语言,网上找了一下GO语言的IDE,发现GO语言目前没有一个专业的IDE,都是一些各种插件来实现的,由于go的特性: 开发过程中需要设置GOPATH 用到第三方的包又要使用go get 运行的时候要用go run 打包的要使用go install 交叉编译的时候还要配置GOARCH GOOS go build 试了很多朋友分享的工具都很不好用,试用了一下Jetbrains的Goland Early build version,发现很多Bug,没有交叉编译,无法go get,并不能满足开发、打包、分发的需求,不过Goland的代码提示还是特别棒的,希望以后正式版能够做的更好。 打造自己的Go语言开发IDE 好了废话不多说,来开始动手打造一个强大的Go语言开发IDE,强大到什么程度,自己体会吧: 支持自动配置GOPATH 支持简单的go run 支持go get 支持go install 当然也支持 “交叉编译” 而且还支持go test go clean 下载并安装 sublime text 3 sub...
- 下一篇
思考gRPC :为什么是protobuf
背景 谈到RPC,就避免不了序列化的话题。 gRPC默认的序列化方式是protobuf,原因很简单,因为两者都是google发明的,哈哈。 在当初Google开源protobuf时,很多人就期待是否能把RPC的实现也一起开源出来。没想到最终出来的是gRPC,终于补全了这一块。 跨语言的序列化方案 事实上的跨语言序列化方案只有三个: protobuf, thrift, json。 json体积太大,并且缺少类型信息,实际上只用在RESTful接口上,并没有看到RPC框架会默认选json做序列化的。 国内一些大公司的使用情况: protobuf ,腾迅,百度等 thrift,小米,美团等 hessian, 阿里用的是自己维护的版本,有js/cpp的实现,因为阿里主用java,更多是历史原因。 序列化里的类型信息 序列化就是把对象转换为二进制数据,反序列化就把二进制数据转换为对象。 各种序列化库层出不穷,其中有一个重要的区别:类型信息存放在哪? 可以分为三种: 不保存类型信息 典型的是各种json序列化库,优点是灵活,缺点是使用的双方都要知道类型是什么。当然有一些json库会提供一些扩展,偷...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案