zoukankan      html  css  js  c++  java
  • 反射

    反射
    1.什么是反射
    反射的概念由smith1982年首次提出,就是指程序可以访问,检测和修改他本身状态或者行为的
    一种能力(自省),他首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩

    2.python中的反射:通过字符串的形式操作对象相关属性.python中的一切事物都是对象(都可以用反射)
    四个可以实现自省的函数
    下列方法适用类和对象(一切皆对象,类本身也是一个对象)
    1.hasattr #attr在英文中是属性的意思 检测是否含有某个属性
    2.getattr 获取属性
    3.setattr 设置属性
    4.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('egon',73)

    #检测是否含有某属性
    print(hasattr(obj,'name'))
    print(hasattr(obj,'say_hi'))

    #获取属性
    n=getattr(obj,'name')
    print(n)
    func=getattr(obj,'say_hi')
    func()

    print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

    #设置属性
    setattr(obj,'sb',True)
    setattr(obj,'show_name',lambda self:self.name+'sb')
    print(obj.__dict__)
    print(obj.show_name(obj))

    #删除属性
    delattr(obj,'age')
    delattr(obj,'show_name')
    delattr(obj,'show_name111')#不存在,则报错
    print(obj.__dict__)


    #类也是对象
    class Foo(object):

    staticField = "old boy"

    def __init__(self):
    self.name = 'wupeiqi'

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


    导入其他模块,利用反射查找该模块是否存在某个方法
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

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

  • 相关阅读:
    <script>元素
    女朋友问什么是动态规划,应该怎么回答?
    从输入URL到页面展示,这中间都发生了什么?
    TypeScript之父:JS不是竞争对手,曾在惧怕开源的微软文化中艰难求生
    Flash 终将谢幕:微软将于年底停止对 Flash 的支持
    尤雨溪:TypeScript不会取代JavaScript
    JVM参数设置、分析(转发)
    -XX:PermSize -XX:MaxPermSize 永久区参数设置
    堆的分配参数
    -Xmx 和 –Xms 设置最大堆和最小堆
  • 原文地址:https://www.cnblogs.com/cangshuchirou/p/8551007.html
Copyright © 2011-2022 走看看