面向对象_反射

反射

反射,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

关于反射的方法有四个,getatter,hastter是一对,表示执行和检测

而setatter是一个关于设置修改的方法

delatter是关于删除的一个方法 

getatter,hastter

class Fruit_price:
    conformation='shopping'
    def __init__(self,original_price,discount,name):
        self.__original_price=original_price
        self.__discount=discount
        self.__name=name
    @property
    def price(self):
        return self.__original_price*self.__discount
    def func(self):
        print('打折啦,现在%s,只要%s 元了'%(self.__name,self.price))
apple=Fruit_price(5,1,'苹果')
print(apple.price)
print(getattr(apple,'price',None))#可以只输入前面的两个值,第三个值是,前面不能只想,便会输出此值
                                    #如果没有输入第三个值,便会报错
#print(getattr(apple,'pric','your input in error')) 报错
print(getattr(apple,'pric','your input in error'))
get = getattr(apple,'func')
get()
print(hasattr(apple,'price'))
print(Fruit_price.conformation)
print(getattr(Fruit_price,'conformation'))
if hasattr(apple,'func'): #一般 hasattr 与 getattr配合使用
    get = getattr(apple,'func')
    get()
'''输出结果5
5
your input in error
打折啦,现在苹果,只要5 元了
True
shopping
shopping
打折啦,现在苹果,只要5 元了
'''

getatter(),后面相当于类名.属性,把 . 改为,, 并且把属性变为字符串了,同理,对象名.属性也是如此。对象名.方法名 就变为了(对象名,‘方法’)得到是一个内存之地,返回值加上(),变

调用这个方法了。getattr有三个参数,最后一个是避免报错的,如果报错就输出最后一个参数

几乎所有 对象.方法(属性)都支持反射。说明其强大

hasattr 的返回值时bool值,一般与gerattr配合使用,一般作为条件,为getattr作为铺垫

反射模块的属性与方法

import time
get=getattr(time,'sleep')
get(3)
print('延迟了3秒')
import sys
print(getattr(sys,'path'))
print(getattr(sys,'version'))

反射自己中的变量和模块

import sys
def wahaha():
    print('lalal')
    return 'i like drink wahahah'
#调用方法一
getattr(sys.modules['__main__'],'wahaha')()
#调用方法二
get = getattr(sys.modules['__main__'],'wahaha')
get()
#有时可能会被当做模块被导入,但是还是要执行自己的的函数。所以此时把'__main__'改为__name__,
#在自己中,__name__输出__main__,被其他文件导入时,此时输出为__模块名__
get = getattr(sys.modules[__name__],'wahaha')

反射的方法有参数时

import time
print(time.strftime('%Y-%m-%d %H:%M:S'))
print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))
get = getattr(time,'strftime')
print(get('%Y-%M-%d:%H-%M'))

 delattr与setattr

class Name:
    def __init__(self,name):
        self.name=name
xiaoming=Name('xiaoming')
setattr(xiaoming,'name',5)# 等价于xiaoming.name=5
                            #此时的要修改的参数,不一定为str
print(xiaoming.name)
class Name:
    def __init__(self,name,age):
        self.name=name
        self.age=age
xiaoming=Name('xiaoming',18)
print(xiaoming.__dict__)
print(xiaoming)
delattr(xiaoming,'age')
print(xiaoming.__dict__)
print(xiaoming)
'''输出结果{'age': 18, 'name': 'xiaoming'}
<__main__.Name object at 0x0000000000A84668>
{'name': 'xiaoming'}
<__main__.Name object at 0x0000000000A84668>
'''
原文地址:https://www.cnblogs.com/accolade/p/10513492.html