• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于python:python的自省与反射机制

python 搞代码 3年前 (2022-02-20) 15次浏览 已收录 0个评论
文章目录[隐藏]

一、自省

自省,就是当解解释型语言被加载到内存中运行时能够晓得对象的类型,以及该对象下有哪些办法等。

1.1 具备自省能力的办法

  • type()

    获取对象的类型,该函数能够确定对象是字符串、整数、列表、字典等

    >>> type(1)
        <type 'int'>
        
    >>> type("hello,world")
        <type 'str'>
        
    >>> type([])
        <type 'list'>
        
    >>> type({})
        <type 'dict'>
        
    >>> class A():
    ...     pass
    ... 
    >>> a = A()
    >>> type(a)
        <type 'instance'>
  • dir()

    此函数能够返回某个对象领有的所有的属性名和办法名

      # 返回列表实例的所有办法名
      >>> dir([])
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',  '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
  • getattr()

    获取对象的属性

  • hasattr()

    判断对象是否具备某属性

  • isinstance()

    判断一个对象是否是某个特定类型或定制类的实例

        >>> isinstance("python", str)  # 判断是否为字符串
        True
        >>> isinstance(10, int)   # 判断是否为int类型
        True
        >>> isinstance(False, bool)  # 判断是否为bool值
        True
  • id()

    函数返回对象的惟一标识符,标识符是一个整数。CPython 中 id() 函数用于获取对象的内存地址。

    >>> a = "python"
    >>> id(a)
    140225451635560
  • callable()

    应用 callable 能够确定一个对象是否是可调用的,比方函数,类这些对象都是能够调用的对象

    >>> callable("hello")
    False
    >>>
    >>> callable(str)
    True
    >>>

二、反射

解释类型的语言,在程序被加载到内存运行的时候,能够通过某种形式获取对象的类型、属性等信息的过程叫做反射。

反射能够通过字符串调用对象属性、办法、导入模块,是一种基于字符串的事件驱动

2.1 具备反射能力的内置函数

  • hasattr()

> 用来检测对象object中是否含有名为name的属性,如果有则返回True,如果没有返回False
class Cls():
    attr1 = 'attr1'

    def __init__(self, attr2):
        self.attr2 = attr2

    def meth1(self, num):
        return num**2

obj = Cls('attribute2')
print(hasattr(obj, 'attr1'))  # >>> True
print(hasattr(obj, 'attr2'))  # >>> True
print(hasattr(obj, 'meth1'))  # >>> True

无论是变量还是办法,都被视为“属性”,因而hasattr都返回True

# 判断对象的属性是否是办法

if hasattr(obj, "attr1"):
    if callable(obj.attr1):
        # attr1 is a method!
    else:
         # attr1 is not a method but an attribute
else:
    # attr1 is not an attribute
  • getattr()

> getattr()用于返回一个对象属性,或者办法

getattr(object, name[, default])

  • object — 对象。
  • name — 字符串,对象属性。
  • default — 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
class A:   
    def __init__(self):   
        self.name = 'zhangjing'  
     # self.age='24'

    def method(self):   
        print"method print"  

Instance = A()   
print(getattr(Instance , 'name, 'not find'))
#如果Instance 对象中有属性name则打印self.name的值,否则打印'not find'

print(getattr(Instance , 'age', 'not find'))   
#如果Instance 对象中有属性age则打印self.age的值,否则打印'not find'

print(getattr(a, 'method', 'default')) 
#如果有办法method,否则打印其地址,否则打印default 

print(getattr(a, 'method', 'default'))()   
#如果有办法method,运行函数并打印None否则打印default  

应用场景:

obj = MyObject()
for x in ['foo', 'bar']:

    # obj.x()  # 毫无疑问,这样是报错的。。。。所以咱们就能够应用getattr

    getattr(obj, x)()

用getattr实现工厂办法:一个模块反对html、text、xml等格局的打印,依据传入的formate参数的不同,调用不同的函数实现几种格局的输入

 import statsout 
 def output(data, format="text"):                           
     output_function = getattr(statsout, "output_%s" %format) 
     return output_function(data)

这个例子中能够依据传入output函数的format参数的不同 去调用statsout模块不同的办法(用格式化字符 串实现output_%s)

  • setattr()

    setattr() 函数对应函数 getattr(),用于设置属性值,该属性不肯定是存在的。

    setattr(object, name, value)

    • object — 对象。
    • name — 字符串,对象属性。
    • value — 属性值。
  >>class A(object):
  ...     bar = 1
  ... 
  >>> a = A()
  >>> getattr(a, 'bar')          # 获取属性 bar 值
  1
  >>> setattr(a, 'bar', 5)       # 设置属性 bar 值
  >>> a.bar
  5
  • delattr()

    删除对象中的变量。留神:不能用于删除办法

    class Person(object):
        def __init__(self,name):
            self.name = name
        def talk(self):
            print("%s正在交谈"%self.name)

    p = Person("laowang")
    delattr(p,"name")       # 删除name变量
    print(p.name)           # 此时将报错


世界上没有难学的Python,如果有,那就是你还没关注公众号。喜爱的敌人能够扫码关注


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:python的自省与反射机制

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址