zoukankan      html  css  js  c++  java
  • python-魔法属性和反射

    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("没有改函数")
  • 相关阅读:
    linux shell在while中用read从键盘输入
    ubuntu14.04折腾迅雷xware
    select与epoll分析
    ubuntu 14.04下练习lua
    C++中的重载、覆盖、隐藏
    删除ubuntu旧内核
    fcntl函数加文件锁
    系统中断与SA_RESTART
    linux使用共享内存通信的进程同步退出问题
    leetcode-easy-others-268 Missing Number
  • 原文地址:https://www.cnblogs.com/butterflies/p/11988816.html
Copyright © 2011-2022 走看看