首页 > 技术文章 > python-魔法属性和反射

butterflies 2019-12-05 13:50 原文

python魔法属性和反射

#!/usr/bin/python3
# coding:utf-8
# Auther:AlphaPanda
# Description:与类相关的魔法属性
# Version:1
# Date:Wed Dec  4 02:22:28 EST 2019

class Man():
    pass

class Woman():
    pass

class Children(Man,Woman):
    """
    成员属性:
        skin,hair
    成员方法:
        eat,drink,__sleep
    """
    skin = "黑皮肤"
    hair = "黄头发"
    
    # 普通无参方法
    def eat():
        print("小孩会吃糖果")
    # 绑定方法:
    def drink(self):
        print("小孩会吃奶奶")
    # 大笑
    def laugh(self,func):
        print(func)
        # 获取函数的名字
        print(func.__name__)
        print("小孩会大笑")
    # 私有方法
    def __sleep(self):
        print("小孩喜欢睡觉")
# __dict__ 获取对象或类的内部成员结构
obj = Children()
print(obj.__dict__)
print(Children.__dict__)

# __doc__ 获取对象或者类的内部文档
print(obj.__doc__)
print(Children.__doc__)


# __name__ 获取类名函数名
def ceshi():
    print("我是测试函数")
obj.laugh(ceshi)

# __class__ 获取当前对象所属的类
cls = obj.__class__
print(cls.hair)

# __bases__ 获取一个类直接继承的所有父类,返回元组
tup = Children.__bases__
print(tup)

### 反射 :通过字符串去操作类对象,或者模块中的属性方法
# 类的反射
# 1 hasattr() 检测对象/类中是否有指定成员
# 对象
res = hasattr(obj,"skin") # 属性
print(res)
res = hasattr(obj,"drink") # 方法
print(res)

#
res = hasattr(Children,"eat")
print(res)

# 2 getaddr() 获取对象/类成员的值

# 对象
res = getattr(obj,"hair") # 属性
print(res)

res = getattr(obj,"hair123","第三个参数是默认值,如果该成员不存在,默认返回该值") 
print(res)

# 类:
res = getattr(Children,"drink")
print(res)

# 反射对象当中的方法
func1 = getattr(obj,"drink")
print(func1) # 反射的是绑定到对象的方法,对象系统会自动传递
func1()

# 反射类当中的方法
func2 = getattr(Children,"drink")
print(func2)
func2(2)

"""
func = input("请输入您要反射的行数:")
if hasattr(Children,func):
    func_new = getattr(Children,func)
    func_new()
else:
    print("不存在该方法")
"""
# 3 setattr()设置对象/类成员的值
# 对象
setattr(obj,"name","wangwen")
print(obj.name)

# 类:
setattr(Children,"wc",lambda : print("小孩会尿尿"))
print(Children.__dict__)
Children.wc()

# 4 delattr() 删除对象/类成员的值
# 对象
print(obj.__dict__)
delattr(obj,"name")
print(obj.__dict__)

# (2) 模块的反射
"""
包:文件夹
模块:文件
"""
def func1():
    print("我是func1方法")
def func2():
    print("我是func2方法")
def func3():
    print("我是func3方法")
def func4():
    print("我是func4方法")

# sys.modules 返回一个字典,字典的键是加载的所有模块
import sys
print(sys.modules)
# 获取当前模块得对象,通过这个对象可以进行反射  __main__这个键对应的是本模块对象
mymodule = sys.modules["__main__"]
print(mymodule)

# 小案例:通过字符串操作了该模块中相应的方法
while True:
    strvar = input("请输入你要反射的方法:")
    if hasattr(mymodule,strvar):
        func = getattr(mymodule,strvar)
        func()
    else:
        print("没有改函数")

 

推荐阅读