### 与类相关的魔术属性
#魔术方法后面加括号,魔术属性直接使用
class Man():
pass
class Woman():
pass
class Children(Man,Woman):
"""
doc文档:
成员属性: eye
成员方法: skylight moonread __makebaby
完成的功能: 描述小孩天生神力.
"""
eye = "血轮眼"
def skylight(self):
print("一下生,直接使用天照,让世界变得混乱")
def moonread(self,func):
print("一下生,使出了武功绝学,月读,世界都黑暗里~")
print(func.__name__ , type( func.__name__ )) # earth_boom
def __makebaby(self):
print("这一手招数,只能我自己用")
obj = Children()
dict 获取对象或类的内部成员结构
print(obj.__dict__)
print(Children.__dict__)
doc 获取对象或类的内部文档
print(obj.__doc__)
print(Children.__doc__)
name 获取类名函数名(返回字符串)
def earth_boom():
print("使出一招地爆天星")
obj.moonread(earth_boom)
obj.moonread(Children)
class 获取当前对象所属的类
print(obj.__class__)
bases 获取一个类直接继承的所有父类,返回元组
print(Children.__bases__) # (, )
### 反射 (针对于类对象,模块(系统)
"""概念: 通过字符串去操作类对象 或者 模块当中的成员(属性方法)"""
class Man():
pass
class Woman():
pass
class Children(Man,Woman):
"""
成员属性: eye
成员方法: skylight moonread __makebaby
完成的功能: 描述小孩天生神力.
"""
eye = "血轮眼"
def skylight(self):
print("一下生,直接使用天照,让世界变得混乱")
def moonread(self,func):
print("一下生,使出了武功绝学,月读,世界都黑暗里~")
print(func.__name__ , type( func.__name__ )) # earth_boom
def __makebaby(self):
print("这一手招数,只能我自己用")
obj = Children()
(1)反射类对象中的成员
hasattr() 检测对象/类是否有指定的成员,主要看对象能否调用,调用就有,格式为hasattr(对象或者类,方法或属性#字符串)★★★★★
用对象调用属性和方法,以字符串的形式调用属性和方法,不需要考虑参数
res = hasattr(obj,"eye")
print(res)
用类调用属性和方法,以字符串的形式调用属性和方法,不需要考虑参数
res = hasattr(Children,"skylight")
res = hasattr(Children,"__makebaby")
print(res)
getattr() 获取对象/类成员的值,格式为getattr(对象或者类,方法或属性#字符串),返回一个值,在获取方法时,要看获取的方法有没有参数(self),有就用对象获取,将获取的值直接调用就可以,不需要加参数,如果获取的方法没有参数就用类获取,获取的值直接调用就可以,不需要加参数,他们都被反射到类外,而且他们都是函数,调用直接加()就可以,★★★★★
对象 获取也是通过字符串,不需要考虑参数,将'skylight'赋值给func后,在赋值后调用时,如果是对象调用,系统自动传参,不需要加对象
func = getattr(obj,"skylight")
func() # 通过对象反射出来的方法是绑定方法
类 获取也是通过字符串,不需要考虑参数,将'skylight'赋值给func后,在赋值后调用时,如果是类调用,看是否有参数(self,或其他参数),有参数要加参数
func = getattr(Children,"skylight")
func(1) # 通过类反射出来的是一个普通方法
当类对象中的成员不存在时,可以设置默认值(第三个参数是默认值参数)
func = getattr(obj,"moonread123345","对不起,该成员不存在")
print(func)
综合案例
"""
strvar = input("请输入你要调用的方法")
if hasattr(obj,strvar):
func = getattr(obj,strvar)
func()
"""
setattr() 添加对象/类成员的值,没有返回值,他们都是添加到对象或者类中,需要对象或者类调★★★★★
在对象添加的时候(只添加到对象里面),如果是添加属性,格式为setattr(对象,属性#字符串,属性内容#字符串),一般对象添加方法少,有就用types,调用的时候,如果添加的是属性,直接对象调用就可以了,类不可以调用对象的,只能对象调用对象的或者类的,类添加方法的时候,都用lambda表达式,格式为setattr(类,方法#字符串,lambda表达式#注意参数),在调用的时候,看是否有参,有参用对象调,没参用类调.
对象
setattr(obj,"eye","白眼")
print(obj.eye)
类
setattr(Children,"tcut",lambda : print("小孩一下生就能用雷切战术"))
Children.tcut()
obj.tcut() #tcut 是一个无参普通方法,只能是类来调用;
delattr() 删除对象/类成员的值 ★★★★★
# 对象
delattr(obj,"eye")
print(obj.eye)
类
delattr(Children,"eye")
print(obj.eye)
(2)反射模块(系统)中的成员
"""sys.modules 返回一个系统的字典,系统的键是模块名,加载系统模块展现出来"""★★★★★
import sys
print(sys.modules
综合案例
获取本模块的对象
print(sys.modules["__main__"])
selfmodule = sys.modules["__main__"]
def func1():
print("我是func1方法")
def func2():
print("我是func2方法")
def func3():
print("我是func3方法")
while True:
strvar = input("请输入你要反射的方法")
if hasattr(selfmodule,strvar):
func = getattr(selfmodule,strvar)
func()
elif strvar.upper() == "Q":
break
else:
print("没有这个方法")