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