博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射(高大上)、类的内置方法
阅读量:6406 次
发布时间:2019-06-23

本文共 2978 字,大约阅读时间需要 9 分钟。

反射

对象的反射

类的反射

模块的反射

本模块的反射:找到本模块sys.modules[__name__]

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

hasattr() 函数用于判断对象是否包含对应的属性。getattr() 函数用于返回一个对象属性值。setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在。delattr 函数用于删除属性。delattr(x, 'foobar') 相等于 del x.foobar。
class Foo:    f = '类的静态变量'    def __init__(self,name,age):        self.name=name        self.age=age    def say_hi(self):        print('hi,%s'%self.name)obj=Foo('egon',73)#检测是否含有某属性print(hasattr(obj,'name'))     #输出结果:Trueprint(hasattr(obj,'say_hi'))   #输出结果:True#获取属性n=getattr(obj,'name')print(n)   #输出结果:egonfunc=getattr(obj,'say_hi')func()   #输出结果:hi,egon#设置属性setattr(obj,'sb',True)setattr(obj,'show_name',lambda self:self.name+'sb')print(obj.__dict__)  #输出结果:{'name': 'egon', 'age': 73, 'sb': True, 'show_name': 
at 0x00000194A8817048>}print(obj.show_name(obj))#删除属性delattr(obj,'age')delattr(obj,'show_name')print(obj.__dict__) #输出结果:{'name': 'egon', 'sb': True}

 

hasattr(对象名,'属性名')  返回True或False属性值 = getattr(对象名,'属性名')方法的内存地址 = getattr(对象名,'方法名')方法的内存地址()
getattr 获取属性
class Management:    role = '管理员'    def __init__(self,name,sex,phone,mail):        self.name = name        self.sex = sex        self.phone = phone        self.mail = mail    def creat_class(self):        print('新建了一条讲师信息')    def creat_teacher(self):        print('新建了一条讲师信息')    def creat_student(self):        print('新建了一条讲师信息')Management.roleif hasattr(Management,'role')    print(getattr(Management,'role'))  # 管理员manager = Management('小雨','女',111252,'1111@qq.com')f = getattr(manager,'creat_class')# f()  # 类外加括号f = getattr(manager,'sex')# 属性反射 # 使用字符串数据类型的变量名获取属性值print(f)  # 类内不用加括号# 
># f() # 新建了一条讲师信息cs = getattr(manager,'creat_class') # 方法反射cs()

hasattr 检查是否含有某属性

# hasattr   getattr 用getattr之前用hasattr,hasattr能检测是否含有某属性class Management:    role = '管理员'    def __init__(self,name,sex,phone,mail):        self.name = name        self.sex = sex        self.phone = phone        self.mail = mail    def creat_class(self):        print('新建了一条讲师信息')    def creat_teacher(self):        print('新建了一条讲师信息')    def creat_student(self):        print('新建了一条讲师信息')import loggingmanager = Management('小雨','女',111252,'1111@qq.com')if hasattr(manager,'sex1'):  # True    sex = getattr(manager,'sex1')#  False    print(sex)else:    logging.warning('没有你输入的属性')

 

 

总结

class Foo:    f = '类的静态变量'    def __init__(self,name,age):        self.name=name        self.age=age    def say_hi(self):        print('hi,%s'%self.name)obj=Foo('egon',73)#检测是否含有某属性print(hasattr(obj,'name'))print(hasattr(obj,'say_hi'))#获取属性n=getattr(obj,'name')print(n)func=getattr(obj,'say_hi')func()print(getattr(obj,'aaaaaaaa','不存在啊')) #报错#设置属性setattr(obj,'sb',True)setattr(obj,'show_name',lambda self:self.name+'sb')print(obj.__dict__)print(obj.show_name(obj))#删除属性delattr(obj,'age')delattr(obj,'show_name')delattr(obj,'show_name111')#不存在,则报错print(obj.__dict__)

 

转载于:https://www.cnblogs.com/jassin-du/p/7890233.html

你可能感兴趣的文章
Mysql存储引擎MyIsAM和InnoDB区别
查看>>
三读《构建之法》——源代码的设计、实现、控制与两人合作
查看>>
a标签的嵌套
查看>>
树checkbox选择jquery实例
查看>>
Linq 增删改查
查看>>
如何配置php客户端(phpredis)并连接Redis--华为DCS for Redis使用经验系列
查看>>
Windows下maven安装配置(包括本地化仓库配置)
查看>>
2013MPD上海6.23 PM 光耀:读心术,用户心理的产品之道
查看>>
CentOS 6.4安装配置LNMP服务器(Nginx+PHP+MySQL)
查看>>
测试结束标准
查看>>
I.MX6 Android /data 目录内容
查看>>
iot_programe Makefile hacking
查看>>
更好的理解position:relative的应用
查看>>
MySQl创建用户和授权
查看>>
javascript:void(0)的用法讲解
查看>>
继承与钻石继承
查看>>
高效能人士
查看>>
【css】rem及其替换方案
查看>>
下面有关 JAVA 异常类的描述,说法正确的有()
查看>>
sicp第二章部分习题解答
查看>>