# ### 与类相关的魔术属性
class Human():
pass
class Man():
pass
class Woman():
pass
class Children(Man,Woman):
'''
类的功能: 描述一个小孩
类的成员属性:eye
类的成员方法:sleep __beat_doudou
'''
eye = "蓝色眼睛"
# 普通方法
def eat():
print("小孩喜欢吃东西")
# 绑定方法
def sleep(self):
print("小孩喜欢睡觉,一天睡20个小时候")
def drink(self):
print("小孩喜欢喝水,喝水尿")
def cry(self,func):
res = func.__name__
print(res,type(res))
# 私有绑定方法
def __beat_doudou(self):
print("小孩喜欢打豆豆")
# __dict__ 获取对象或类的内部成员结构
obj = Children()
res = obj.__dict__
print(res)
print(Children.__dict__)
# __doc__ 获取对象或类的内部文档
res = Children.__doc__
print(res)
# __name__ 获取类名函数名
def myfunc():
print("我是函数")
obj.cry(myfunc)
# __class__ 获取当前对象所属的类
res = obj.__class__
print(res)
# __bases__ 获取一个类直接继承的所有父类,返回元组
res = Children.__bases__
print(res)
# ### 反射
# 概念:通过字符串去操作类对象 或者 模块中的属性方法
# (1)hasattr() 检测对象/类是否有指定的成员 [以是否能够调用为基准]
res = hasattr(obj,"eye")
print(res)
res = hasattr(Children,"eat")
print(res)
# (2)getattr() 获取对象/类成员的值
res = getattr(obj,"eye")
print(res)
res = getattr(obj,"sleep")
print(res) # 它返回的是一个绑定方法
res()
res = getattr(Children,"eat")
print(res)
res()
res = getattr(Children,"sleep")
print(res) # 它不是一个绑定方法
res(123)
# getattr 第三个参数可选,如果获取不到这个值,可以添加默认提示.预防报错
res = getattr(obj,"abc","对不起这个真没有")
print(res)
# strvar = input("请输入您要调用的函数")
# if hasattr(obj,strvar):
# res = getattr(obj,strvar)
# res()
# (3)setattr() 设置对象/类成员的值
setattr(obj,"hair","屎黄色")
print(obj.hair)
setattr(Children,"skin","绿色")
print(Children.skin)
# (4)delattr() 删除对象/类成员的值
delattr(obj,"hair")
# print(obj.hair)
delattr(Children,"skin")
# print(Children.skin)
# (2)模块的反射
# sys.modules 返回一个系统字典,字典的键是加载的所有模块
import sys
res = sys.modules
print(res)
print(__name__) #__main__
mymodule = sys.modules[__name__]
print(mymodule) # 模块对象
def func1():
print("这是func1方法")
def func2():
print("这是func2方法")
def func3():
print("这是func3方法")
# 用户给我字符串,我反射对应的方法调用
while True:
strvar = input("请输入您要调用的方法")
if hasattr(mymodule,strvar):
_func_ = getattr(mymodule,strvar)
_func_()
else:
print("大哥,没有")