面向对象之反射(定制)

Posted happyfei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象之反射(定制)相关的知识,希望对你有一定的参考价值。

什么是反射?

反射的盖面是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),

这一概念的提出很快引发了计算机科学领域关于应用反射的研究。它首次被程序语言的设计领域所采用。并在Lisp和面向

对象方面取得了成绩。

 

python3中四个可以实现自省的函数,下列方法适用于类和对象

class BlackMedium:
    feture=Ugly
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
    def sell_hourse(self):
        print([%s]正在卖房子,傻逼才买呢%self.name)
    def rent_hourse(self):
        print([%s]正在租房子,傻逼才买呢%self.name)

b1=BlackMedium(黑中介,殡仪馆)

 

1、hasattr(object,name)

判断object中有没有一个name字符串对应的方法或属性

技术分享图片
class BlackMedium:
    feture=Ugly
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
    def sell_hourse(self):
        print([%s]正在卖房子,傻逼才买呢%self.name)
    def rent_hourse(self):
        print([%s]正在租房子,傻逼才买呢%self.name)

b1=BlackMedium(黑中介,殡仪馆)
print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殡仪馆‘}
# b1.name------->b1.__dict__[‘name]
print(b1.name)#黑中介
print(b1.addr)#殡仪馆
#用hasattr检测类的属性和方法,存在返回TRUE,不存在返回FALSE
print(hasattr(b1,name))#True
print(hasattr(b1,addr))#True
print(hasattr(b1,namnmae))#False
hasattr(object,name)

 

2、getattr(object,name,default=None)

检测正确时,有属性就返回属性值,有方法就返回方法的内存地址,加()就可以运行

检测有错误时,不给default赋值会报错,报错时写什么会提示什么

技术分享图片
#检测属性,属性存在就会打印值,属性不存在会打印报错或default
print(getattr(b1,name))#黑中介
print(getattr(b1,aaaaaa))#有报错提示
print(getattr(b1,aaaaaa,没有此属性))#有报错提示:没有此属性

#检测方法,有则返回内存地址,加()就可以运行,没有则报错或提示default信息
print(getattr(b1,sell_hourse,无此方法))#返回sell_hourse方法的内存地址,-------》b1.sell_hourse
#<bound method BlackMedium.sell_hourse of <__main__.BlackMedium object at 0x0000020EE5447198>>
#有内存地址加()就可以运行
func=getattr(b1,sell_hourse)
func()#[黑中介]正在卖房子,傻逼才买呢

print(getattr(b1,jskdkflsd,无此方法))#无此方法
getattr(object,name,default)

 

3、setattr(x,y,z)

可以增加修改属性,也可以增加方法,

x传入对象,y传入字符串相当于字典中的key,x传入值相当于字典中的value

技术分享图片
print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殡仪馆‘}
setattr(b1,name,SB)#修改属性
setattr(b1,sb,True)#增加属性
print(b1.__dict__)#{‘name‘: ‘SB‘, ‘addr‘: ‘殡仪馆‘, ‘sb‘: True}
setattr(b1,func,lambda self:self.name+SB)#增加函数属性
# print(b1.func(b1))#黑中介SB
setattr(x,y,z)

 

4、delattr(x,y)

删除属性x,y同上

技术分享图片
print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殡仪馆‘}
delattr(b1,name)#删除属性------》del b1.name
# del b1.name
print(b1.__dict__)#{‘addr‘: ‘殡仪馆‘}
setattr(x,y)

 

以上是关于面向对象之反射(定制)的主要内容,如果未能解决你的问题,请参考以下文章

Python之面向对象-反射

python面向对象之反射

面向对象练习3-定制数据类型

面向对象之反射

面向对象之反射

Python面向对象之反射,双下方法