zoukankan      html  css  js  c++  java
  • 面向对象_反射

    反射

    反射,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在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>
    '''
  • 相关阅读:
    Add Binary <leetcode>
    那些坑
    面试集锦
    随看随记
    View的事件处理流程
    android studio view.setId报错
    EditText的hint不显示
    EditText 焦点
    Android拍照的那些事
    微信支付提示签名错误
  • 原文地址:https://www.cnblogs.com/accolade/p/10513492.html
Copyright © 2011-2022 走看看