面对对象中的反射

#反射:把凡是对象.属性(变量或函数,方法)的这样的形式都可以转换成对象于字符串的形式,在这个转换
#过程中要用到四个函数,分别是hasattr(),getattr(),setattr(),delattr()
#这里的对象指向很广,不仅有类的实例化对象,类本身,还有模块,所有能写成xx.yy的,xx就是所说的对象
#hasattr(),getattr(),setattr(),delattr()等作用和说明
#hasattr(obj,name)obj可以是对象(或类),name是属性的字符串,hasattr的作用是判断
#obj是否有该字符串,可看成obj.name1是否定义了.其本质上是在obj.__dict__的字典中是否存在该key值,
# 即if name in obj.__dict__,这里的name只是一个代表,是一个字符串
#getattr(obj,name)返回该对象的字符串的值,可看成是res =obj.name1,取res
# 即res = obj.__dict__[name],取res值
#setattr(obj,name,value)该该对象的字符串赋值,可看成obj.name1=value
# 即obj.__dict__[name]=value
#delattr(obj,name)删除该对象的字符串,可看成del obj.name1
# 即del obj.__dict__[name]
#注:(obj,name)中的name是字符串,而obj.name1中的name1是属性(变量或函数),它们是不同的
"""
=====对象是类,或是类实例化的对象
class People:
country = 'china'
def __init__(self,name):
self.name =name

def walk(self):
print('%s walk'%self.name)

p =People('egon')#类的实例化,就会触发__init__方法(如果有),就会执行__init__中的代码
print(People.walk) #形式是obj.name,其中obj是类名People,name是walk,所以类能反射
print(hasattr(People,'walk'))#其中hasattr(obj,name),obj是类名People,name是'walk'
#它的作用是先判断People.walk是否存在,然后打印True or False
print(p.walk)#形式是obj.name,其中obj是类的实例化对象,name是walk,所以对象也能反射
print(hasattr(p,'walk'))#其中hasattr(obj,name),obj是实例化对象p,name是'walk'
#先判断p.walk是否存在,然后打印True or False,即if 'walk' in p.__dict__(People.__dict__)

print(getattr(People,'walk'))#先读取People.walk的值,然后把该值打印
print(getattr(p,'walk'))#先读取p.walk的值,然后把该值打印
print(getattr(p,'walk11','不存在该walk属性'))#先是判断p.walk是否存在,如果存在就读取该值,
#并打印出来,如果不存在就读取‘不存在该walk属性’,并把它打印出来
print(getattr(p,'name'))
setattr(p,'name',123)
print(getattr(p,'name'))
#注:getattr(obj,name(字符串类),sss),当obj.name(属性)不存在时,getattr函数返回的是sss(字符串)
# name(属性)与name(字符串)是不同的,name(属性)是变量名或是函数名,它没有类型,但是
# name(字符串)是字符串型
"""
"""
#反射当前模块的属性
import sys

x =100
class Foo:
print('from class Foo')#它虽然在类Foo中,但是不在类Foo的名称空间中,它在当前脚本空间中

def s1():
print('s1')

def s2():
print('from to s2')

#在当前位置使用该模块
this_module = sys.modules[__name__]#在当前脚本中把它以上的内容当成模块,然后把该模块赋值
#并把模块的内容执行一遍
print(this_module)
#print(this_module.__dict__)
print(this_module.s1)
print(hasattr(this_module,'s1'))
print(this_module.x)
print(hasattr(this_module,'x'))
print(this_module.Foo.__dict__)
print(hasattr(this_module,'Foo'))
"""

"""
#把输入的模块名(python中存在的模块),当成模块使用
# import importlib
# t=importlib.import_module('time') #把字符串转化为模块名,相当于t =import time
# print(t.time())
"""
posted @ 2017-04-24 19:10  study_python  阅读(248)  评论(0编辑  收藏  举报