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')()

  

猜你喜欢

转载自www.cnblogs.com/zhaoyang110/p/9392954.html