7、第六 - 面向对象高级语法-反射

   反射就是通过字符串映射或修改程序运行时的状态、属性、方法。常用这几种模式:getattr(obj,name_str,default=None)、hasattr(obj,name_str)、setattr(obj,'Y,'Z') 、delattr(x,y) 

反射
hasattr(obj,name_str), 判断一个对象obj是否有对应的name_str字符串的方法。
getattr(obj,name_str), 根据字符串去获取obj对象里的对应的方法内存地址。
setattr(obj,'y',z),给我一个对象,添加新的属性。
delattr(obj,y),删除属性
反射的操作

举例说明:

class Dog(object):
    def __init__(self,name):
        self.name = name
        self.other = None

    def eat(self):
        print ("%s is eatting ...." % self.name)

    def bulk(self):
        print("%s is bulking..." % self.name)

d = Dog("dog1") #实例化对象

####正常的实例调用########
d.eat()
d.bulk()
输出:
dog1 is eatting ....
dog1 is bulking...

####检查是否含有该成员######
print(hasattr(Dog,'eat'))
输出:
True

####获取成员内存地址#########
print(getattr(Dog,'eat'))
输出:
<function Dog.eat at 0x10217aea0>

###设置成员#################
attr = setattr(Dog,'age',13)
getattr(Dog,'age')
print(getattr(Dog,'age'))
输出:
13

###删除成员################
delattr(Dog,'bulk')
print (hasattr(Dog,'bulk')) #False 说明属性已经删除
输出:
False

1、反射中的静态属性调用

'''
反射
    hasattr(obj,name_str), 判断一个对象obj是否有对应的name_str字符串的方法。
    getattr(obj,name_str), 根据字符串去获取obj对象里的对应的方法内存地址。
    setattr(obj,'y',z),给我一个对象,添加新的属性。
    delattr(x,y),删除属性
'''

def bulk(self):
    print("%s is yelling .." % self.name)

class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print("%s is eating the %s ...." % (self.name,food))

d = Dog("dog123")

choice = input(">>:").strip()

if hasattr(d,choice):   #判断输入choice的方式是否在 d 对象里面,如果则开始执行。
    fun = getattr(d,choice)
    fun("Bread")  #传入一个food参数

else:
    setattr(d,choice,bulk) #静态属性,只能输入talk ,由于调用的方法已经固定。输入其他会报错
    d.talk(d) #整个项目中是没有talk方法,talk 把bulk给改写了,属于静态装属性。

操作:
if部分 
>>:eat
dog123 is eating the Bread ....

else部分:
>>:talk
dog123 is yelling ..

============================================
else部分输入其他 都会报错
>>:bulk
Traceback (most recent call last):
  File "/Users/mac/PycharmProjects/untitled2/51CTO/6day/反射.py", line 31, in <module>
    d.talk(d) #整个项目中是没有talk方法,talk 把bulk给改写了,属于静态装属性。
AttributeError: 'Dog' object has no attribute 'talk'
>>:chen
Traceback (most recent call last):
  File "/Users/mac/PycharmProjects/untitled2/51CTO/6day/反射.py", line 31, in <module>
    d.talk(d) #整个项目中是没有talk方法,talk 把bulk给改写了,属于静态装属性。
AttributeError: 'Dog' object has no attribute 'talk'

 2、反射中的动态属性调用

'''
反射
    hasattr(obj,name_str), 判断一个对象obj是否有对应的name_str字符串的方法。
    getattr(obj,name_str), 根据字符串去获取obj对象里的对应的方法内存地址。
    setattr(obj,'y',z),给我一个对象,添加新的属性。
    delattr(x,y),删除属性
'''

def bulk(self):
    print("%s is yelling .." % self.name)

class Dog(object):

    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print("%s is eating the %s ...." % (self.name,food))

d = Dog("dog123")

choice = input(">>:").strip()

if hasattr(d,choice):
    fun = getattr(d,choice)
    fun("Bread")

else:
    #动态属性,直接返回22
    setattr(d,choice,22)
    print(getattr(d,choice))

操作
if 部分:
>>:eat
dog123 is eating the Bread ....

else部分:动态顺便输入,返回都是22 ,这个值已经固定
>>:chen
22

 

posted on 2018-03-14 15:58  C.Q&CHEN  阅读(155)  评论(0)    收藏  举报

导航