Python面向对象的反射

什么是反射(自省)?

反射的概念是由Smith在1982年提出的,主要是指程序可以访问,检测和修改他本身状态或行为的一种能力(自省)。

几种面向对象的反射属性

  • hasattr(object,name):判断object里有没有一个name字符串(‘属性名’)对应的方法或属性
  • getattr(object,name):获取属性值
  • setattr(object,name):修改或者新增属性及值
  • delattr(object,name):删除属性
class Student(object):
    country = 'china'
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def get_name(self):
        print('正在调用get_name方法。。。')
        return self.name
    def get_age(self):
        return self.age
 
 
s = Student('bayi',33)
 
# hasattr(object,name):判断object里有没有一个name字符串(‘属性名’)对应的方法或属性
print(hasattr(s,'name')) # True
print(hasattr(s,'get_name')) # True
print(hasattr(s,'get_con')) # False
 
# getattr(object,name):获取属性值
print(getattr(s,'name')) # bayi
print(getattr(s,'get_name')) # <bound method Student.get_name of <__main__.Student object at 0x000001426082D668>>
# 获取方法信息返回的是方法名,想要运行方法,如何操作呢
n = getattr(s,'get_name')
print(n()) # bayi
 
# setattr(object,name,newname):新增属性及值,修改属性及值
setattr(s,'name','feng') # 修改属性及值
print(s.name) # feng
setattr(s,'aihao','famele')
print(getattr(s,'aihao')) # famele
 
# delattr(object,name):删除属性
print(getattr(s,'age')) # 33
delattr(s,'age')
if hasattr(s,'age'):
    print(getattr(s,'age'))
else:
    print('age属性不存在')
# 结果:age属性不存在
 
 
'''
Python一切皆对象,文件也是对象,所有文件也可以反射
    需求:检测一下time这个当前模块有没有某些属性
    需求:检测当前模块有没有某些属性
'''
import time
#     需求:检测一下time这个当前模块有没有某些属性
print(hasattr(time,'ctime')) # True
f = getattr(time,'ctime')
print(f()) # Thu Apr 16 10:47:49 2020
 
# 需求:检测当前模块有没有某些属性
import sys
# 获取当前模块对象
# print(sys.modules)
cur_obj = sys.modules[__name__] # 获取当前模块的对象
print(hasattr(cur_obj,'a')) # False
a = 22
print(hasattr(cur_obj,'a')) # True
原文地址:https://www.cnblogs.com/phyger/p/13753680.html