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()函数

  • 相关阅读:
    Java基础学习篇---------static
    Java基础学习篇---------this、object的学习
    Java基础学习篇---------String、集合的学习
    Java基础学习篇---------多态
    Java基础学习篇---------继承
    Java基础学习篇---------封装
    Java基础学习篇---------多线程
    Handler主线程和子线程相通信
    Handler的使用
    c# DataGridView操作
  • 原文地址:https://www.cnblogs.com/tom2ling/p/8877791.html
Copyright © 2011-2022 走看看