python-反射

反射

python面向对象中的反射:通过字符串的形式操作对象相关的属性

hasattr(obj,name)

# hasattr(obj, name)
# 判断一个对象是否有指定的属性name,返回True/False
# name是字符串形式的
class C:
    def __init__(self, x=0):
        self.x = x
c1 = C()
print(hasattr(c1, "x")) #打印 True
print(hasattr(c1, "y")) # 打印 False
print(hasattr(c1, x)) # 报错,NameError:name "x" is not defined

getattr(obj, name[, default = None])

# getattr(obj, name[, default = None])
# 返回对象指定的属性值,如果是特征属性,就是返回变量的数据值,如果是方法属性,即返回函数名
# 如果找不到指定的属性,默认就报错。如果默认部分有设置,就打印默认部分的内容
class C:
    def __init__(self, x=0):
        self.x = x
    def getsize(self):
        print(x)
c1 = C()
print(getattr(c1,"x")) # 打印0
print(getattr(c1, "y")) # 报错
print(getattr(c1,"y","您访问的属性不存在...")) # 打印:您访问的属性不存在...
getattr(c1, "getsize")() # 相当于执行 c1.getsize()函数,打印0

setattr(obj, name, value)

# setattr(obj, name, value)
# 设定对象指定属性的值,如果该属性不存在,就新建这个属性
class C:
    def __init__(self, x=0):
        self.x = x
c1 = C()
setattr(c1, "y", 20)
getattr(c1, "y") # 打印20

delattr(obj, name)

# delattr(obj, name)
# 删除对象中指定的属性,如果该属性存在就默默执行删除,如果不存在就报错

sys.modules[__name__]

  • 反射当前模块成员:变量、函数、类 都可以
  • 如果名字相同,反射最靠近的那个
#demo1:反射函数
import sys
def s1:pass
def s2:pass

hasattr(sys.modules[__name__], "s1")

#demo2: 反射类
import sys
class M1:pass
class M2:pass

hasattr(sys.modules[__name__], "M1")

你可能感兴趣的:(python-反射)