一以贯之

面向对象--反射

反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
 
2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数
hasattr    判断一个命名空间中有没有这个名字
getattr     从命名空间中获取这个名字对应的值
setattr
delattr
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

 

 使用字符串数据类型的变量名,访问一个命名空间中的名字

 

 hasattr

 

def hasattr(*args, **kwargs): # real signature unknown
"""
Return whether the object has an attribute with the given name.
This is done by calling getattr(obj, name) and catching AttributeError.
"""
pass

 

 getattr

def getattr(object, name, default=None): # known special case of getattr
"""
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
pass

 

setattr

def setattr(x, y, v): # real signature unknown; restored from __doc__
"""
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to ``x.y = v''
"""
pass

 

 

delattr

def setattr(x, y, v): # real signature unknown; restored from __doc__
"""
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to ``x.y = v''
"""
pass

 

 

四个方法的演示

 

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

 

 

 

 

 

类中的反射

类可以获取类中的属性和方法

getattr
getattr(A,'role')
class A:
    role = 'Person'
    def func(self):
        print('*'*self)

print(getattr(A,'role'))  #Person  #从A的命名空间里找一个属性,直接就可以找到这个属性的值
f = getattr(A,'func')           #从A的命名空间里找一个方法,找到的是这个方法的内存地址
f(2)            #**

 

print(getattr(A,'role'))  #Person       #从A的命名空间里找一个属性,直接就可以找到这个属性的值
f = getattr(A,'func');f(1)           #从A的命名空间里找一个方法,找到的是这个方法的内存地址

getattr(A,'func')(1)
#使用字符串数据类型的变量名,访问一个命名空间中的名字

 

 

hasattr
判断这个空间里是有有这个属性
class H:
    role = 'hero'
    def func(self):
        print('*'*self)

ret = input(">>")
if hasattr(A,ret):
    print(getattr(A,ret))

 

 

 

 
 
setattr(修改和新建)
delattr(删除一个属性)

 

 

 

 

 

 

 

 

posted on 2019-04-24 17:09  凡夫or俗子  阅读(111)  评论(0)    收藏  举报