zoukankan      html  css  js  c++  java
  • Python 基础第二十三天(反射)

    今日主要内容

    1.面向对象高级特性---反射

    2.内置函数和内置方法补充

    1.什么是反射:

    通过内置函数getattr(),hasattr(),setattr(),delattr()实现,在类外通过对字符串的操作,能够将类内同名的静态变量,方法,如对象属性是无法取到值的.

    也可以理解为:

    ***正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值

    使用字符串数据类型的变量名 访问一个命名空间中的名字

    找一个属性 ,直接就可以找到这个属性的值

    找一个方法 ,找到的是这个方法的内存地址

    例:

    class A:
        role = 'Person'
        def func(self):
            a = 'b'
            print("*" * self)
    print(getattr(A,'role')) #静态变量的反射
    print(getattr(A,'func')) #类中方法取到的是内存地址
    getattr(A,'func')(3) #类中方法的反射

    **类使用类命名空间中的名字

    例:下面例中使用对象名进行获取

    class A:
        role = 'Person'
        def __init__(self):
            self.money = 500
        def func(self):
            print('*'*10)
    
    a = A()  #实例化a 为对象名称
    print(a.func) 
    getattr(a,'func')() 
    print(getattr(a,'money'))

    ***对象使用对象能用的方法和属性

    内置函数的介绍:

    hasattr() 判断一个命名空间中有没有这个名字
    getattr() 从命名空间中获取这个名字对应的值

    模块含义:模块就是类所在python的文件名

    例:

    def login():
        print('执行login功能')
    def register():
        print('执行register功能')
    
    import sys
    print(sys.modules['__main__'])  #<module '__main__' from 'F:/Python-script-2/s11-day23/a.py'> 
    func = input('>>>')
    if hasattr(sys.modules['__main__'],func)#检查输入的信息,是否a.py有
        getattr(sys.modules['__main__'],func)()  # 有就执行该函数

    类使用类命名空间中的名字
    getattr(类名,'名字')
    对象使用对象能用的方法和属性
    getattr(对象名,'名字')
    模块使用模块中的名字
    导入模块
    getattr(模块名,'名字')

    import os 
    getattr(os,'rename')('user','user_info')

    getattr一定要和hasattr配合使用

    setattr  # 修改和新建

    delattr  # 删除一个属性

    setattr

    例:

    class A:
        def __init__(self,name):
            self.name = name
    
        def wahaha(self):
            print('wahahahahaha')
    
    a = A('alex')
    a.name
    a.wahaha()
    getattr(a,'name')
    print(a.__dict__)
    setattr(a,'age',18)  #增加了一个属性
    print(a.__dict__)
    
    结论:
    wahahahahaha
    {'name': 'alex'}
    {'name': 'alex', 'age': 18}

    delattr

    例:

    class A:
        def __init__(self,name):
            self.name = name
    
        def wahaha(self):
            print('wahahahahaha')
    
    a = A('alex')
    a.name
    a.wahaha()
    getattr(a,'name')
    print(a.__dict__)
    setattr(a,'age',18)
    print(a.__dict__)
    delattr(a,'age')
    print(a.__dict__)
    
    结论:
    wahahahahaha
    {'name': 'alex'}
    {'name': 'alex', 'age': 18}
    {'name': 'alex'}

    2.内置函数,方法补充

    isinstance :判断一个对象和一个类有没有血缘关系

    issubclass:issubclass(子类名,父类名) 如果返回True,说明有继承关系.判断子类和父类是否有继承关系

    isinstance与type方法类似,都能判断数据类型,但是isinstance还能还能检测是否有继承关系

    例:

    class B:pass
    class A(B):pass
    a = A()
    print(isinstance(a,A))
    print(isinstance(a,B))  # 能够检测到继承关系
    print(type(a) is A)
    print(type(a) is B)     # type只单纯的判断类
    # 判断一个对象和一个类有没有血缘关系
    isinstance(a,A)

    __hash__ :object类自带的方法.只有类实现了__hash__,hash()才能用

    __len__:放在类中的计算传值结果的长度,数量  同len(),类中含有__len__方法,才能使用len()函数

  • 相关阅读:
    最大子数组求和并进行条件组合覆盖测试
    Ubuntu 16.04 c++ Google框架单元测试
    The directory '/home/stone/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If execu
    Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
    个人博客作业三:微软小娜APP的案例分析
    补交 作业一
    补交 作业二:个人博客作业内容:需求分析
    嵌入式软件设计第12次实验报告
    嵌入式软件设计第11次实验报告
    嵌入式软件设计第10次实验报告
  • 原文地址:https://www.cnblogs.com/tom2ling/p/8877791.html
Copyright © 2011-2022 走看看