首页 / PYTHON / Python3 反射
Python3 反射
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python3 反射,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3462字,纯文字阅读大概需要5分钟。
内容图文
![Python3 反射](/upload/InfoBanner/zyjiaocheng/608/c0f5f198175848fbaa050469591ef133.jpg)
1.反射是什么?
python是动态语言,而反射(reflection)机制被视为动态语言的关键。
反射机制指的是在程序的运行状态中
对于任意一个类,都可以知道这个类的所有属性和方法;
对于任意一个对象,都能够调用他的任意方法和属性。
这种动态获取程序信息以及动态调用对象的功能称为反射机制。
2.如何实现反射
在python中实现反射非常简单,在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,
若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式
>>> class People: ... def __init__(self,name,age,gender): ... self.name=name ... self.age=age ... self.gender=gender ... >>> obj=People('egon',18,'male') >>> dir(obj) # 列表中查看到的属性全为字符串 [......,'age', 'gender', 'name']
通过字符串来操作对象的属性,及到内置函数hasattr、getattr、setattr、delattr的使用了(Python中一切皆对象,类和对象都可以被这四个函数操作,用法一样)
hasattr、getattr、setattr、delattr分别对应,检查是否含有某成员、获取成员、设置成员、删除成员
hasattr(obj,name_str):判断一个对象obj里是否有name_str字符串对应的的方法或者属性,返回bool值
getattr(obj,name_str):相当于obj.name_str,根据字符串去获取obj对象里对应的方法的内存地址或对应属性的值,返回一个对象的属性值
setattr(x, 'y', v) :相当于``x.y = v'',即通过字符串设置新的属性,可以给类动态添加属性
delattr(x, 'y'):相当于``del x.y'',删除对象obj里y字符串对应的属性和方法
class Teacher: def __init__(self,full_name): self.full_name =full_name t=Teacher('Egon Lin') # hasattr(object,'name') hasattr(t,'full_name') # 按字符串'full_name'判断有无属性t.full_name # getattr(object, 'name', default=None) getattr(t,'full_name',None) # 等同于t.full_name,不存在该属性则返回默认值None # setattr(x, 'y', v) setattr(t,'age',18) # 等同于t.age=18 # delattr(x, 'y') delattr(t,'age') # 等同于del t.age
基于反射可以十分灵活地操作对象的属性,比如将用户交互的结果反射到具体的功能执行
>>> class FtpServer: ... def serve_forever(self): ... while True: ... inp=input('input your cmd>>: ').strip() ... cmd,file=inp.split() ... if hasattr(self,cmd): # 根据用户输入的cmd,判断对象self有无对应的方法属性 ... func=getattr(self,cmd) # 根据字符串cmd,获取对象self对应的方法属性 ... func(file) ... def get(self,file): ... print('Downloading %s...' %file) ... def put(self,file): ... print('Uploading %s...' %file) ... >>> server=FtpServer() >>> server.serve_forever() input your cmd>>: get a.txt Downloading a.txt... input your cmd>>: put a.txt Uploading a.txt...
3.注意点
a.setattr只能动态添加类和对象的属性,不能添加方法
b.给类和对象动态添加属性,可以直接赋值。注意,给对象赋的,类中是没有的,是对象独有的。给类赋的,对象也可以访问。
c.用赋值给类添加方法,方法括号中不加self,类可以调用。但对象调用,会报错,func() takes 0 positional arguments but 1 was given。方法括号中加self,则是反过来。
自己写代码测试时,可以。实际代码中要用MethodType。
d.MethodType可以把外部函数(方法)绑定到类或类的实例中。
#用法:<类(或者实例)>.<为要添加的方法或属性起的名字> = MethodType(<要添加的方 法或属性>, 类(或者实例)) from types import MethodType class Student(object): pass def set_score(self, score: int): self.score = score Student.set_score = MethodType(set_score, Student) Student.set_score(99)
防止方法重名,可先用hasattr来判断。
限制实例的属性 __slots__
ps:3种方式获取obj对象中的name变量指向内存中的值
class Foo(object): def __init__(self): self.name = 'alex' def func(self): return 'func' # 不允许使用 obj.name obj = Foo() print(obj.name) print(getattr(obj, 'name')) print(obj.__dict__['name'])
内容总结
以上是互联网集市为您收集整理的Python3 反射全部内容,希望文章能够帮你解决Python3 反射所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。