'''
反射
hasattr(obj, name):判断一个对象obj里是否包含名为name的属性或方法(hasattr是通过调用getattr(object, str)是否抛出异常来实现的)
getattr(obj, name, "default"):如果对象obj中有属性或者方法name,则打印属性str或者打印方法的地址(方法地址加上()即可运行方法),否则打印default
setattr(obj, name, value):方法里的参数为obj对象,name字符串,value值。字符串可能会是一个现有的属性或一个新的属性(新属性是全局变量或方法) ,增加的方法必须为全局方法或全局变量
delattr(obj, name):参数为obj对象和模块中的name属性之一 ,该方法为删除该obj的一个指定的属性(仅删除实例对象中的属性name,并不是删除模块中的)
'''
def bulk():
print("UserPython is yelling...")
class People(object):
def __init__(self, name):
self.name = name
def talk(self):
print("%s is talking..." % self.name)
User = People("UserPython")
# 判断一个对象User里是否是否存在方法或属性
print(hasattr(User, "name")) #True
# 根据字符串去获取User对象里的对应的属性或方法的内存地址
print(getattr(User, "name", "default")) #>>>UserPython
print(getattr(User, "talk", "default")) #>>><bound method People.talk of <__main__.People object at 0x00000000026F1320>>
print(getattr(User, "talk", "default")()) #>>>UserPython is talking... None (如果有talk,运行talk方法,并打印None,否则打印default)
#给People模块增加一个全局变量age = 19,创建成功返回None
setattr(User, "age", 19)
print(User.age) #>>>19
#给People模块增加一个全局方法
setattr(User, "BULK", bulk)
User.BULK() #>>>UserPython is yelling...
#删除实例对象中某个属性或方法,模块中该属性不会被删除
delattr(User, "name") #删除User实例name属性 === del User.name
# print(User.name) #>>>AttributeError: 'People' object has no attribute 'name'证明已经删除了属性name
动态导入模块