首页 > 其他 > 详细

面向对象_反射

时间:2019-03-12 13:02:51      阅读:168      评论:0      收藏:0      [点我收藏+]

反射

反射,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!