python之反射和内置函数__str__、__repr__
一、反射
反射类中的变量
反射对象中的变量
反射模块中的变量
反射本文件中的变量 、定义:使用字符串数据类型的变量名 来获取这个变量的值
例如:
name = 'xiaoming'
print(name) # xiaoming
print('name') # name 平时我们要想获取'xiaoming'这个值,要用name去获取,但是如果想用字符串'name' 获取这个值呢,
就需要用到反射。 、反射应用的场景(就是把接收的字符串转换成变量的名字便于使用)
,input
用户输入的如果是a,那么就打印1,如果输入的是b就打印2,如果输入的是name,就打印xiaoming
,文件
从文件中读出的字符串,想转换成变量的名字
,网络
将网络传输的字符串转换成变量的名字
、反射类中的变量 : 静态属性,类方法,静态方法
class Foo:
School = 'Zhbit'
Country = 'China'
language = 'Chiness' @classmethod
def class_method(cls):
print('in class_method')
@staticmethod
def static_method():
print('in staticmethod') def hahaha(self):
print('hahaha') # 如果要实现输入School就打印对应的值,Country也打印对应的值,那么:
# ,用判断实现:
inp = input('请输入:')
if inp == 'School':print(Foo.School)
elif inp == 'Country':print(Foo.Country)
elif inp == 'language':print(Foo.language)
# 在属性少的时候这样写,没什么问题,但是想一想,如果有100个属性呢,你要写100次判断吗?
所以,请看反射。 # ,反射实现
while True:
inp = input('>>>')
print(getattr(Foo,inp))
# OK,这就实现了,而且无论多少个属性,都可以实现,很简单吧!
# 那么下面就来解析反射需要用到的方法 -1getattr方法
用法:getattr(变量名(命名空间),字符串(属于一个命名空间内的变量名)) # 获取静态属性
print(getattr(Foo,'School')) # 就等于 Foo.School print(getattr(Foo,'class_method')) # 就等于 Foo.class_method 得到的是一个函数地址
print(getattr(Foo,'static_method')) #就等于 Foo.static_method 得到的是一个函数地址
# 若想执行这个函数
getattr(Foo,'class_method')() # in class_method
getattr(Foo,'static_method')() # in staticmethod -2hasattr方法
# 要是没有这个属性或者方法就会报错,那么出于安全考虑,就需要判断有没有这个属性或者方法才去执行
# 就要用到hasattr()
print(hasattr(Foo,'class_method')) #True
print(hasattr(Foo,'hello')) # False while True:
inp = input('请输入:')
if hasattr(Foo,inp):
print(getattr(Foo,inp)) 、反射对象属性,普通方法
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age def sleep(self):
print('%s在睡觉,快打死他' %self.name) xiaobai = Foo('小白',)
print(getattr(xiaobai,'name'))
getattr(xiaobai,'sleep')() 、反射模块中的变量
import os # os就是一个模块
os.rename('a.txt','a.bak')
getattr(os,'rename')('a.bak','a.txt') 、反射本文件中的变量
a =
b =
age =
# 函数
def func():
print() # 类
class A:pass import sys
print(sys.modules['__main__']) # 本文件的命名空间
print(sys.modules['__main__'].a) # 本文件的命名空间中的a变量的值:
print(sys.modules['__main__'].func) # 本文件的命名空间中函数func的地址:<function func at 0x000001C735B81E18>
print(sys.modules['__main__'].A) # 本文件的命名空间中类A的地址:<class '__main__.A'> # __name__ 与 '__main__' 一样,代表本文件的命名空间
print(sys.modules['__main__'])
print(sys.modules[__name__]) # 反射
print(getattr(sys.modules[__name__],'a')) #
print(getattr(sys.modules['__main__'],'a')) #
print(getattr(sys.modules[__name__],'age')) # getattr(sys.modules[__name__],'func')() #执行函数func:
obj = getattr(sys.modules[__name__],'A')() #实例化对象
print(obj) 、setattr:增和改
# 类
class Foo:
country = 'China' # 函数
def func():
print() print(getattr(Foo,'country')) # China
setattr(Foo,'country','Big China') # 接受三个参数:命名空间 '变量名' 变量值
print(getattr(Foo,'country')) # Big China setattr(Foo,'fun',func) # 为类Foo新增一个属性fun,值为func函数的地址
print(func) # <function func at 0x00000188B34F2D08>
print(Foo.fun) # <function func at 0x0000026DC4A21E18>
getattr(Foo,'fun')() # 、delattr:删
class Foo:
language = '火星文'
country = 'China' def func():
print() print(Foo.__dict__)
delattr(Foo,'language')
print(Foo.__dict__) 二、内置方法__str__和__repr__
、内置方法的定义
不需要程序员定义,本身就存在类中的方法就是内置方法,
它不用我们直接调用,当遇到特定的场景就会自动触发,
内置的方法通常都长这样 : __名字__
可以叫 : 双下方法、 魔术方法、 内置方法
比如我们熟悉的初始化函数__init__()就是内置方法,
实例化对象的时候就自动执行 、__str__和__repr__
__str__
当你打印一个对象的时候print(obj) 触发__str__
当你使用%s格式化的输出对象时候print('%s' %obj) 触发__str__
str强转数据类型的时候str(obj) 触发__str__ __repr__
repr是str的备胎
直接打印对象,有__str__的时候执行__str__,没有__str__的时候,执行__repr__
当你使用%r输出对象时候print('%r' %obj) 触发__repr__
repr强转数据类型的时候repr(obj) 触发__repr__ 注意:__str__ 和__perp__都必须要用return,而且返回值必须是字符串 例子:
class Fruit:
def __init__(self,name,price):
self.name = name
self.price = price def __str__(self):
return 'in str:%s的价格是:%s' %(self.name,self.price) def __repr__(self):
return 'in repr:%s的价格是:%s' % (self.name, self.price) apple = Fruit('苹果',) # 直接打印对象,有__str__的时候执行__str__,没有__str__的时候,执行__repr__
print(apple) # in str:苹果的价格是: # 当你使用%s格式化的输出对象时候print('%s' %obj) 触发__str__
print('%s' %apple) # in str:苹果的价格是: # 当你使用%r输出对象时候print('%r' %obj) 触发__repr__
print('%r' %apple) # in repr:苹果的价格是: # str强转数据类型的时候str(obj) 触发__str__
print(str(apple)) # in str:苹果的价格是: # repr强转数据类型的时候repr(obj) 触发__repr__
print(repr(apple)) # in repr:苹果的价格是: 升级:
class Fruit:
def __str__(self):
return 'Fruit_str' def __repr__(self):
return 'Fruit_repr' class Apple(Fruit):
def __str__(self):
return 'Apple_str' def __repr__(self):
return 'Apple_repr' apple = Apple()
print(apple)
# apple是Apple类对象,直接打印,先从Apple类找,有__str__的时候执行Apple的__str__,没有__str__的时候,
# 从父类去找__str__,父类有就执行,如果父类没有,就找子类的__repr__,有就执行子类的__repr__,没有就去父类找,
#父类有就执行,没有就打印对象空间地址
python之反射和内置函数__str__、__repr__的更多相关文章
- python 类(object)的内置函数
python 类(object)的内置函数 # python 类(object)的内置函数 ### 首先 #### 以__双下划线开头的内置函数 __ #### __往往会在某些时候被自动调用,例如之 ...
- Python标准库:内置函数hasattr(object, name)
Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...
- python字符串——"奇葩“的内置函数
一.前言 python编程语言里的字符串与我们初期所学的c语言内的字符串还是有一定不同的,比如python字符串里的内置函数就比语言的要多得多:字符串内的书写格式也会有一点差异,例:字符串内含有引 ...
- 《Python》反射、内置方法(__str__,__repr__)
一.反射 通过字符串的形式操作对象相关的属性.(使用字符串数据类型的变量名来获取这个变量的值) Python中的一切事物都是对象(都可以使用反射) 反射类中的变量 反射对象中的变量 反射模板中的变量 ...
- python面向对象 : 反射和内置方法
一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类 (注:type(对象名) is 类名 : 判断对象所属 ...
- Python学习日记(十一) 内置函数
什么是内置函数? 就是Python中已经写好了的函数,可以直接使用 内置函数图表: 以3.6.2为例 内置函数分类: 一.反射相关 1.hasattr() 2.getattr() 3.setattr( ...
- 组合&反射&面向对象内置函数
内容概要 组合 反射 面向对象的内置函数 异常 内容详细 一.组合 组合:在对象中定义一个属性,属性的值是另一个对象 除了继承父类的方法,这是获取另一个类中属性的另一种方式 如果想给学生对象添加课程属 ...
- Python装饰器、内置函数之金兰契友
装饰器:装饰器的实质就是一个闭包,而闭包又是嵌套函数的一种.所以也可以理解装饰器是一种特殊的函数.因为程序一般都遵守开放封闭原则,软件在设计初期不可能把所有情况都想到,所以一般软件都支持功能上的扩展, ...
- day28 面向对象:反射,内置函数,类的内置方法
面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...
随机推荐
- 开源前端脚本错误监控及跟踪解决项目BadJS试用
摘要: 试用BadJS. 原文:开源前端脚本错误监控及跟踪解决项目-BadJS 试用 作者:过错 Fundebug经授权转载,版权归原作者所有. BadJS 是 一个web 前端脚本错误监控及跟踪项目 ...
- js获取文件后缀
//获取文件后缀 function getType(file){ var filename=file; var index1=filename.lastIndexOf("."); ...
- Odoo POS会员积分当钱用如何设置?
问题提问 设定积分规则1元积1分.而后每1积分可以当1分钱用,POS中能处理吗? 解决方案 1) 设定服务类型产品“积分”,其单价为0.01,收入科目为“销售费用” 2) 设定积分计划:积分规则是,订 ...
- java StringBuilder 和 StringBuffer
1, 相对于 String 来说, StringBuilder 和 StringBuffer 均是可变的 2, StringBuilder 线程不安全, StringBuffer 线程安全 3, 运行 ...
- 等价路由在路由器和CE交换机上默认的行为是不同的,路由器总是走第一个下一跳,CE交换机是逐包。
结论: 1.在eNSP中实验,路由器和CE交换机对于等价路由的默认转发行为是不同的, 路由器:默认是基于流的转发形态,更准确的来讲,ping两个不同的下一跳,都是走等价路由的第一个路由,不走第二条路由 ...
- Kotlin入门(32)网络接口访问
手机上的资源毕竟有限,为了获取更丰富的信息,就得到辽阔的互联网大海上冲浪.对于App自身,也要经常与服务器交互,以便获取最新的数据显示到界面上.这个客户端与服务端之间的信息交互,基本使用HTTP协议进 ...
- Redis保证事务一致性,以及常用的数据结构
reids命令可以参考中文官网:http://redis.cn/commands.html 关于reids的使用,可以封装到工具类进行调用: Redis的工具类:JedisAdapter 除了数据结构 ...
- 【NodeJS】Node.JS 开发环境安装
1.前言 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O ...
- java 中文乱码以及转码
查看此文章需要对字符集编码有一定的认识:任意门:字符集编码基础 一.字符串的内部表示? 重点:字符串在java(指在JVM中.在内存中)中统一用unicode表示( 即utf-16 LE) , 下面解 ...
- 从0开始的Python学习005运算符与表达式
地三鲜 土豆+茄子+青椒=地三鲜 这就是一个表达式,表达式是由运算符和操作数组成的. 土豆.茄子和青椒是操作数,炒是运算符,而地三鲜就是最后结果也就是这个表达式的值. 表达式 一个表达式可以分解为运 ...