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

    什么是反射

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

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

    下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

    1)hasattr:可以查看前面的元素是否拥有后面的元素,后面的元素要用引号包裹,前面不需要。

    但是这里必须要实例化,如果是hasattr(Foo,‘name’)报False.

    class Foo:
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
        def func(self):
            print('yes')
    l1=Foo('egon',19)
    print(hasattr(l1,'age'))
    l2=getattr(l1,'age')
    print(l2)
    print(int(getattr(l1,'age'))-20)
    print(hasattr(l1,'Foo'))

    2)getattr:   根据括号的元素拿到相应的值,getattr(l1,l2),也就是如果后面的元素属于前面,那么会取出l1.l2的值。如果不是那就报错。

    如果getattr(l1,'l2')尾部再加上'加上某些东西',例:gerattr(l1,'l2','l3'),如果是错误了那么会显示最后双引号里面的东西,也就是l3,如果是正确则不会显示,只会显示正确的答案。

    class Foo(object):
        staticField = "old boy"
        def __init__(self):
            self.name = 'wupeiqi'
        def func(self):
            return 'func'
        @staticmethod
        def bar():
            return 'bar'
    print(getattr(Foo, 'staticField'))
    print(getattr(Foo, 'func'))
    print(getattr(Foo, 'bar'))

    实例化能得到结果,不实例化就指挥显示内存地址。

    class Foo(object):
        staticField = "old boy"
        def __init__(self):
            self.name = 'wupeiqi'
        @staticmethod
        def func():
            return 'func'
        @classmethod
        def bar(cls):
            return 'bar'
    print(getattr(Foo, 'staticField'))
    l1=getattr(Foo, 'func')
    l2=getattr(Foo, 'bar')
    print(l1())
    print(l2())

    这里有staticmethod使得getattr()里面Foo得以实现

    这里还有一个sys模块调用的方法。

    import sys
    
    def s1():
        print 's1'
    
    def s2():
        print 's2'
    
    this_module = sys.modules[__name__]
    
    hasattr(this_module, 's1')
    getattr(this_module, 's2')

    3)

    __str__和__repr__

    改变对象的字符串显示__str__,__repr__

    自定制格式化字符串__format__

    class Foo:
        def __init__(self,name):
            self.name = name
        def __str__(self):
            return '%s obj info in str'%self.name
        def __repr__(self):
            return 'obj info in repr'
    
    f = Foo('egon')
    print(f)
    print('%s'%f)
    print('%r'%f)
    print(repr(f))  # f.__repr__()
    print(str(f))
    这里不管是__str__还是__repr__都是要return 的值,没有则会报错。
    #当打印一个对象的时候,如果实现了str,打印中的返回值
    #当str没有被实现的时候,就会调用repr方法
    #但是当你用字符串格式化的时候 %s和%r会分别去调用__str__和__repr__
    #不管是在字符串格式化的时候还是在打印对象的时候,repr方法都可以作为str方法的替补
    #但反之不行
    #用于友好的表示对象。如果str和repr方法你只能实现一个:先实现repr
  • 相关阅读:
    Heroku
    Git基本命令(转)
    github之从零开发
    物理层、、。。。
    BeautifulSoup, 的使用
    路径设置
    http协议
    Python 的os模块与sys模块
    python 操作MySQL数据库
    多进程记要
  • 原文地址:https://www.cnblogs.com/52forjie/p/7376276.html
Copyright © 2011-2022 走看看