zoukankan      html  css  js  c++  java
  • python 的反射机制与内置方法

    一 反射

    1、什么是反射

    指的是在程序运行过程中可以'动态(不见棺材不落泪)'获取对象的信息(数据属性,函数属性)

    这种动态获取程序信息以及动态调用对象的功能称为反射机制。动态语言的定义事先是不确定数据类型的

    2、为何要用反射

    在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,若想操作其内部属性,这时候就需要用到反射机制

    3、如何实现反射

    3.1、实现反射机制的步骤

    ​ 1)先通过 dir :查看某一个对象下可以 . 出哪些属性来

    print(dir(obj)) #[.......]
    

    ​ 2)可以通过字符串反射到真正的属性上,得到属性值

    print(obj.__dict__[dir(obj)[-2]])  #但是并不是所有对象都有__dict__方法
    

    二 内置函数

    1、四个内置函数的使用

    定义在类内部,以__ 开头并以 __结尾的方法

    特点:会在某种情况下自动触发执行

    四个内置函数的使用:通过字符串来操作属性值

    class People:
     		def __init__(self, name, age):
          	self.name = name
            self.age = age
            
        def say(self):
          	print('<%s:%s>' %(self.name,self.age))
    
    obj=People('辣白菜同学',18)
    
    

    1、hasattter(对象,'属性名')

    通过字符串,判断对象是否有该属性或方法

    print(hasattr(obj,'name')) #True
    print(hasattr(obj,'x')) #False
    

    2、getattr(对象,'属性名')

    通过字符串,存在则获取对象属性名对应的值,否则报错或者返回自定义的值

    #属性操作
    print(getattr(obj,'name')) #辣白菜同学
    print(getattr(obj, 'x', None))#None
    
    #方法操作
    res1=getattr(obj,'say') # obj.say
    res2=getattr(People,'say') # People.say
    print(res1) #<bound method People.say of <__main__.People object at 0x10321e518>>
    print(res2) #<function People.say at 0x1032171e0>
    

    3、setattr(对象,'属性名',值)

    通过字符串,设置或者修改属性的值

    setattr(obj,'name','EGON') # obj.name='EGON'
    print(obj.name) #EGON
    
    setattr(obj,'x',111) # obj.x=111  x 不存在则添加
    print(obj.x) #111
    

    4、delattr(对象, '属性名')

    通过字符串,删除属性

    print(obj.__dict__) #{'name': '辣白菜同学', 'age': 18}
    delattr(obj,'name') # del obj.name
    print(obj.__dict__) #{'age': 18}
    

    2、内置函数的具体使用

    案例一:

    obj = 10
    if hasattr(obj, 'x'):
        print(getattr(obj, 'x'))
    else:
        print(getattr(obj,'x','木有该属性名'))
    
    #结果展示
    '''
    木有该属性名
    '''
    

    案例二:

    class Ftp:
        def put(self):
            print('正在执行上传功能')
    
        def get(self):
            print('正在执行下载功能')
    
        def interactive(self):
            method=input(">>>: ").strip() # method='put'
    
            if hasattr(self,method):
                getattr(self,method)()
            else:
                print('输入的指令不存在')
    
    
    obj=Ftp()
    obj.interactive()
    
    

    二 内置方法

    1、什么是内置方法

    定义在类内部,以__ 开头并以 __结尾的方法

    特点:会在某种情况下自动触发执行

    2、为何要用内置方法

    为了定制我们需要的类或者对象

    3、如何使用内置方法

    1、__ str __ :在打印对象时会自动触发,然后将返回值(必须是字符串类型)当做本次打印的结果输出,默认为对象的内存地址

    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __str__(self):
            # print('运行了...')
            return "<%s:%s>" %(self.name,self.age)  #返回值必须是字符串类型
    
    
    obj = People('辣白菜同学', 18)
    # print(obj.__str__()) #<辣白菜同学:18>
    print(obj)  # <'辣白菜同学':18>
    
    

    python 内置方法

    obj1=int(10)
    print(obj1) #10  这是经过处理的,为了让我们更好的看到结果
    
    

    2、__ del __ :在清理对象时自动触发,会先执行该方法

    ​ 当类中有__ del __ 方法时,如果没有调用该方法时,会在程序执行完毕后自动触发,清除应用程序占用的内存资源(和 python 的垃圾处理机制作用重复),它是主要用来清除应用程序占用的系统资源(这是 python 的垃圾处理机制做不到的), 通过自动触发 __ del __ 方法发起系统调用,告诉操作系统回收相关的系统资源。

    案例一:没有 主动调用__ del __ 方法

    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
            self.x = open('a.txt',mode='w')
            # self.x = 占据的是操作系统资源
    
        def __del__(self):
            print('run...')
            # 发起系统调用,告诉操作系统回收相关的系统资源
            self.x.close()
    
    obj = People('辣白菜同学', 18)
    print('============>')
    
    #结果展示
    '''
    ============>
    run...
    '''
    
    

    案例二:主动调用__ del __ 方法

    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
            self.x = open('a.txt',mode='w')
            # self.x = 占据的是操作系统资源
    
        def __del__(self):
            print('run...')
            # 发起系统调用,告诉操作系统回收相关的系统资源
            self.x.close()
    
    obj = People('辣白菜同学', 18)
    del obj # 等于 obj.__del__()
    print('============>')
    
    #结果展示
    '''
    run...
    ============>
    '''
    
    
  • 相关阅读:
    SharePoint 2013 配置基于表单的身份认证
    SharePoint 2013 场解决方案包含第三方程序集
    SharePoint 2010 站点附加数据升级到SP2013
    SharePoint 2013 在母版页中插入WebPart
    SharePoint 2013 搭建负载均衡(NLB)
    SharePoint 部署解决方案Feature ID冲突
    SharePoint 2013 配置基于AD的Form认证
    SharePoint Server 2016 Update
    SharePoint 2013 为用户组自定义EventReceiver
    SharePoint 2013 JavaScript API 记录
  • 原文地址:https://www.cnblogs.com/xy-han/p/12709526.html
Copyright © 2011-2022 走看看