zoukankan      html  css  js  c++  java
  • python面向对象中反射

    反射的定义:

      用字符串数据类型的变量名来访问这个变量的值

    python面向对象中的反射,通过字符串的形式操作对象相关的属性.

    python中一切都是对象(都可以使用反射)

    反射的方法:

      getattr 获取属性

       hasattr  检测是否函数某属性

      setattr 设置属性

      delattr  删除属性

    class Foo:
        f = "类的静态变量"
        def __init__(self,name,age): # 初始方法
            self.name = name
            self.age =age
        def say_hi(self):  # 函数,方法
            print("hi,%s" %self.name)
    obj = Foo("zhao",18)
    
    #检测是否由某属性
    print(hasattr(obj,"name"))
    #检测obj这个对象里面有没有name这个属性
    print(hasattr(obj,"say_hi"))
    #检测obj这个对象里面有没有say_hi这个方法
    
    # 获取属性
    n = getattr(obj,"name")
    print(n)
    func = getattr(obj,'say_hi')
    func()
    
    # print(getattr(obj,"aaa"))  # 不存在这个属性或者方法的话,直接报错
    
    #设置属性
    setattr(obj,'sb',True)
    setattr(obj,"show_name",lambda self:self.name + "帅哥")
    print(obj.__dict__)
    print(obj.show_name(obj))
    
    #删除属性
    delattr(obj,"age")
    delattr(obj,"show_name")
    print(obj.__dict__)

    类也是对象:

    class Foo:
        staticField = 'old boy'
    
        def __init__(self):
            self.name = "zhaoyang"
        def func(self):
            return  "func"
        @staticmethod
        def bar():
            return 'bar'
    print(getattr(Foo,'staticField'))
    print(getattr(Foo,'func'))
    print(getattr(Foo,'bar'))

    反射当前模块成员

    import sys
    
    
    def s1():
        print 's1'
    
    
    def s2():
        print 's2'
    
    
    this_module = sys.modules[__name__]
    
    hasattr(this_module, 's1')
    getattr(this_module, 's2')

    导入其他模块,利用反射查找该模块是否存在某个方法

    def test():
        print('from the test')
    """
    程序目录:
        module_test.py
        index.py
     
    当前文件:
        index.py
    """
    
    import module_test as obj
    
    #obj.test()
    
    print(hasattr(obj,'test'))
    
    getattr(obj,'test')()

      

  • 相关阅读:
    POJ2355 Railway tickets DP优化
    POJ3280 Cheapest Palindrome 区间DP
    POJ2352 Stars 线段树
    适牛的类岛娘头文件<转载>
    Ural 1519 Formula 1 插头DP(单回路)
    POJ3345 Bribing FIPA 树形DP+分组背包
    6个变态的C语言HelloWorld程序<转载>
    POJ2374 Fence Obstacle Course DP+线段树优化
    POJ3133 Manhattan Wiring 插头DP
    ACdream 完美数 数位DP
  • 原文地址:https://www.cnblogs.com/zhaoyang110/p/9392954.html
Copyright © 2011-2022 走看看