zoukankan      html  css  js  c++  java
  • python-37-各种反射

    前言

    python中的一切事物都是对象,都可以使用反射!python面向对象中的反射是:通过字符串的形式操作任何对象相关的类、方法及属性。

    反射对象中的属性和方法,有这几个方法:

    • hasattr()
    • getattr()
    • setattr()
    • delattr()

    1、反射对象的属性,getattr:

    # 1、反射对象的属性:
    class A:
        dic={
            'a':1,
            'b':2,
            'c':''}
        def __init__(self,name):self.name=name
    res=A('广深小龙')
    r=getattr(res,'name')       # 查看属性:(实例化对象,属性变量名)
    print(r)

     2、反射对象的方法,getattr:

    # 2、反射对象的方法:
    class A:
        dic={
            'a':1,
            'b':2,
            'c':''}
        @staticmethod
        def func():
            return 'qasdasdasd'
    r1 = getattr(A,'func')
    print(r1)           # 拿到的是func方法
    print(r1())         # 可以调用到函数

     3、反射类的属性,getattr:

    # 3、反射类的属性:
    class A:
        dic = {
            'a':'ff',
            'b':'func'}
    print(getattr(A,'dic'))

     4、反射类的方法,getattr:

    # 4、反射类的方法:
    class A:
        dic = {
            'a':'ff',
            'b':'func'}
        @staticmethod
        def ff():return '调用了ff方法'
        @classmethod
        def func(cls):return '调用了func方法'
        def hub(self):return '调用了hub方法'
    print(getattr(A,'ff')())
    print(getattr(A(),'hub')()) # 注意:A()是因为hub是普通类的方法需要传self
    
    if hasattr(A(),'hub'):  # hasattr 判断是否存在,返回bool
        print(getattr(A,'func')())

    5、反射模块的属性与方法,getattr:
    内置函数、自己定义的函数都可以使用

    # 5、反射模块的属性与方法
    # 内置函数、自己定义的函数都可以使用
    import test
    getattr(test,'r')               # 反射模块的属性
    func=getattr(test,'func')      # 反射模块的方法
    print(func())

     6、反射自己模块中的变量与方法,getattr:

    # 6、反射自己模块中的变量与方法
    name = '广深小龙'
    def func():
        return 'func函数'
    
    import sys
    print(getattr(sys.modules['__main__'],'name'))     # 反射自己模块的变量
    print(getattr(sys.modules['__main__'],'func')())   # 反射自己模块的函数

     可能给其他模块调用就将'__main__'改为变量:__name__

    # 可能给其他模块调用就将'__main__'改为变量:__name__
    import sys
    def name():return '小龙女'
    ret=print(getattr(sys.modules[__name__],'name')())# 反射自己模块的函数

    7、反射带参数、反射模块的类函数,getattr,hasattr:

    # 7、反射带参数、反射模块的类函数
    class A:
        @staticmethod
        def func(name,age):return name+age
    print(getattr(A,'func')('广深小龙','23'))   # 反射带参数
    import test
    if hasattr(test,'A'):                        # 判断是否反射到其他模块类:A,返回bool
        res = getattr(test,'A')()                # 反射其他模块的类:A
        print(res.f())
    else:print('没有反射到对象!')

    8、新增静态属性:setattr; 删除静态属性:delattr

    # 8、新增静态属性:setattr
    class A:pass
    a = A()
    setattr(a,'name','广深小龙')
    setattr(A,'name','小龙')
    print(a.name)
    print(A.name)
    
    # delattr 删除静态属性
    delattr(a,'name')      # 删除实例化的a
    print(a.name)           # 找的是类的name,因为原来的 广深小龙 被删除了

     欢迎来大家QQ交流群一起学习:482713805 !!!

  • 相关阅读:
    muduo源代码分析--Reactor在模型muduo使用(两)
    uinty3d导入错误问题解决
    道量化交易程序猿(25)--Cointrader之MarketData市场数据实体(12)
    CSS cursor 属性
    手动挖第一桶金,10日赚3十万元
    JavaScript取出字符串和尾随空格
    编程的子阵列和最大和膨胀的美(可连接的端到端)
    OpenCV图像的基础叠加
    [SCSS] Organize SCSS into Multiple Files with Partials
    [CSS Flex] Justify-content
  • 原文地址:https://www.cnblogs.com/gsxl/p/12527987.html
Copyright © 2011-2022 走看看