反射

 

参考:http://www.cnblogs.com/alex3714/articles/5213184.html

hasattr(obj,name_str):判断一个对象obj里是否有对应的name_str字符串的方法
getattr(obj,name_str):根据字符串取获取obj对象里的对应的方法的内存地址
setattr(obj,"y",z):相当于x.y = v

delattr(obj,name_str):删除一个属性

def bulk(self):
    '''
    类不存在的方法,利用反射的情况,需要写在类外
    :param self: 
    :return: 
    '''
    print("%s 在叫!"%self.name)

class Dog(object):
    '''
    test反射
    '''
    def __init__(self,name):
        self.name =name

    def eat(self):
        print("%s 吃着...."%self.name)

d = Dog("alex")
choice = input("choice>>:").strip()
a = hasattr(d,choice)#判断输入的字符串是否在实例d里,若存在,则返回True,否则False
if a:
    print(a)
    b = getattr(d,choice)
    print(b)
    '''
    输入eat,返回的b就是内存对象,可以加()调用对应函数
    输入name,返回的b就是实例属性
    '''
# 输入的字符串不在类里,则可以利用setattr(x,"y",v),x.y = v 设置对象
else:
    c = setattr(d,choice,None)#d.choice = None
    d = getattr(d,choice)#获取d.choice的值
    print(c)
    print(d)

 

def bulk(self):
    '''
    类不存在的方法,利用反射的情况,需要写在类外
    :param self:
    :return:
    '''
    print("%s 在叫!"%self.name)

class Dog(object):
    '''
    test反射
    '''
    def __init__(self,name):
        self.name =name

    def eat(self):
        print("%s 吃着...."%self.name)

d = Dog("alex")
choice = input("choice>>:").strip()
a = hasattr(d,choice)#判断输入的字符串是否在实例d里,若存在,则返回True,否则False
if a:
    print(a)
    b = getattr(d,choice)
    print(b)
    delattr(d,choice)#删除实例对应的属性
    '''
    输入eat,返回的b就是内存对象,可以加()调用对应函数
    输入name,返回的b就是实例属性
    '''
#     这里显示删除name属性的例子,所以提示错误
print(d.name)
删除name属性报错的例子

 

posted @ 2018-01-19 21:19  雨之愿风  阅读(92)  评论(0编辑  收藏  举报