面向对象中的反射

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

class Penson:
    soul = "a"
    conntry = "b"

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __getattr__(self, item):
        print("get")

    def __setattr__(self, key, value):
        print("set")

    def __delattr__(self, item):
        print("delattr")

    def __del__(self):
        print("del")

    @staticmethod
    def fn(self):
        print("fn")

    @classmethod
    def func(cls):
        print(cls.soul)

对象中使用getattr,hasattr查询非类中的属性会触发类中的__getattr__方法,当__getattr__不报错时,hasattr返回True.使用getattr,hasattr查询类中属性方法时(方法都属于类的),则不会触发类中的__getattr__方法,调用的是object中的方法.

对象中使用setattr和delattr分别触发__setattr__和__delattr__方法.

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys


def s1():
    print 's1'


def s2():
    print 's2'


this_module = sys.modules[__name__]

hasattr(this_module, 's1')
getattr(this_module, 's2')

反射当前模块成员

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

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def test():
    print('from the test')
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
"""
程序目录:
    module_test.py
    index.py
 
当前文件:
    index.py
"""

import module_test as obj

#obj.test()

print(hasattr(obj,'test'))

getattr(obj,'test')()

猜你喜欢

转载自www.cnblogs.com/zxmbky/p/9282481.html