zoukankan      html  css  js  c++  java
  • Python 反射

    Python反射

      - 通过字符串映射或修改程序运行时的状态、属性、方法。

      - 通常用于框架或库的开发。

    反射的4个方法

      hasattr (常用)    判断对象(属性或方法)是否存,返回布尔值

      getattr (常用)    获取对象(属性或方法),返回对象方法的内存地址

      setattr          设置对象(属性或方法)

      delattr          删除对象(属性或方法)

    # hasattr(object, name)

      判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print("%s is eating..." % self.name)
    
    obj = Dog("alex")
    print(hasattr(obj, "name"))
    print(hasattr(obj, "eat"))
    

    >>> True True

     

    # getattr(object, name[,default])
      获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
      需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,可以在后面添加一对括号。

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print("%s is eating..." % self.name)
    
    
    obj = Dog("alex")
    print(getattr(obj, "name"))
    print(getattr(obj, "age", 38)) #若属性不存在,则返回一个默认值
    getattr(obj, "eat")()
    >>>
    alex
    38
    alex
    is eating...

    # setarrt(obj, y, v)

      将函数装配到obj类中成为类方法。

    def setattr(x, y, v): # real signature unknown; restored from __doc__
        """
        Sets the named attribute on the given object to the specified value.
        
        setattr(x, 'y', v) is equivalent to ``x.y = v''
        """
        pass
    
    --------------------------------------------------------
    
    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print("%s is eating..." % self.name)
    
    obj = Dog("alex")
    getattr(obj, "age", setattr(obj, "age", 38))  # 若getarrt无法获取“age”, 就使用setattr创建"age"
    print(obj.age)
    
    >>>
    38

    结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!  

  • 相关阅读:
    MATLAB 制作gif动画
    MATLAB求解浸润角
    MATLAB 解代数方程组
    空间直线同任意形状椭球交点
    空间旋转——四元数表示
    坐标系旋转 & 坐标点旋转
    展开循环来加速计算
    空间直线同球体交点求解
    变量初始化问题
    python 实现多个线程间消息队列传递,一个简单的列子
  • 原文地址:https://www.cnblogs.com/vincenshen/p/6080424.html
Copyright © 2011-2022 走看看