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
人有傲骨终不贱,脚踏实地见真章;
超出预期为工作,价值体现显能力。
浙公网安备 33010602011771号