面向对象--反射

Posted forjie

tags:

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

什么是反射

反射的概念是由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的值。如果不是那就报错。

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

 

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

第三十四篇 Python面向对象之 反射(自省)

深入理解面向对象与反射

面向对象进阶一

Python之面向对象-反射

面向对象--反射

python面向对象之反射