面向对象 -- 反射

什么是反射

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

面向对象的反射

getarre

getarre() ,一个内置函数

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

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

猜你喜欢

转载自www.cnblogs.com/biulo/p/10627492.html