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

    什么是反射

    反射主要指程序可以访问,检测和修改它本身状态或行为的一种能力(自省)。

    面向对象的反射

    getarre

    getarre() ,一个内置函数

    作用是通过字符串类型的属性名,得到真正的这个字符串的名字对应的对象的属性值

    所有的 a.b 都可以变成 getattr(a,'b')

    用字符串数据类型的变量名,来获取实际的变量值(找到这个变量对应的内存地址)

    class Student:
        def __init__(self,name):
            self.name = name
    wu = Student('')
    ret = getattr(wu,'name')
    此时 ret 就相当于 wu.name

    hasattr

    hasattr(),一个内置函数

    if hasattr(a,b)   判断b是不是对象a里面的属性

    class Student:
        def __init__(self,name):
            self.name = name
    wu = Student('')
    name = input('>>>')
    if hasattr(wu,name): 判断输入的内容是否是wu这个对象里的属性或方法
        ret = getattr(wu,name)

    callable

    callable(a)   一个内置函数,作用是判断a是否可以被调用

    实例应用

    class Jay:
        def __init__(self,name):
            self.name = name
    
        def sweet(self):
            print('告白气球')
    
        def warm(self):
            print('不能说的秘密')
    
        def real(self):
            print('稻香')
    
        def guitar(self):
            print('晴天')
    
        def nice(self):
            print('七里香')
    j = Jay('周杰伦')
    while 1:
        song = input('>>>')
        if hasattr(j,song):
            nb = getattr(j,song)
            if callable(nb):
                nb()
            else:
                print(nb)
        else:
            print('输入错误,请重新输入')
    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__)
  • 相关阅读:
    状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
    简单几何(推公式) UVA 11646 Athletics Track
    简单几何(四边形形状) UVA 11800 Determine the Shape
    简单几何(求交点) UVA 11437 Triangle Fun
    计算几何模板
    简单几何(相对运动距离最值) UVA 11796 Dog Distance
    简单几何(求划分区域) LA 3263 That Nice Euler Circuit
    覆盖的面积 HDU
    Desert King 最小比率生成树 (好题)
    约会安排 (区间合并)毒瘤题
  • 原文地址:https://www.cnblogs.com/biulo/p/10627492.html
Copyright © 2011-2022 走看看