Python_反射
反射:根据字符串来获取相应的内存对象(相应对象的内存地址)
关于反射的几个函数:hasattr(), getattr(), setattr(), delattr()
1. hasattr(object,name)
判断一个对象里是否有name属性或者方法,如果有返回Ture,否则返回False
2.getattr(object,name[,default])
获取对象object的属性或方法,若存在则打印出来,若不存在打印默认值
(注:若返回对象是方法,则返回的是方法的内存地址)
import sys
class Animal(object):
def __init__(self,name):
self.name = name
def Dog(self):
print('%s 吃粑粑。。' % self.name)
def Cat(self):
print('%s 喵喵叫。。' % self.name)
def Print_A(self):
self.Dog()
self.Cat()
if __name__=='__main__':
D = Animal('狗类')
C = Animal('猫类')
# D.Dog()
# C.Cat()
if hasattr(D, sys.argv[1]): # 判断D实例中,是否有Dog属性
func = getattr(D, sys.argv[1]) # 获取D.Dog方法的内存地址
func()
else:
print('Animal中没有这个类。。')
D:\1.pycharm>dir
驱动器 D 中的卷是 软件
卷的序列号是 0002-A33B
D:\1.pycharm 的目录
2018/10/26 15:13 <DIR> .
2018/10/26 15:13 <DIR> ..
2018/10/26 16:19 <DIR> .idea
2018/09/07 08:18 <DIR> day 2018_09_06
2018/08/13 16:37 <DIR> day1
2018/09/09 18:35 <DIR> day2
2018/09/05 10:05 <DIR> day2018_09_04
2018/09/07 19:40 <DIR> day2018_09_07
2018/09/09 09:47 <DIR> day2018_09_08
2018/09/18 21:01 <DIR> day2018_09_10
2018/09/13 10:27 <DIR> day2018_09_12
2018/09/13 10:55 <DIR> day2018_09_13
2018/09/14 18:18 <DIR> day2018_09_14
2018/09/17 17:56 <DIR> day2018_09_16
2018/09/18 16:56 <DIR> day2018_09_17
2018/09/18 21:20 <DIR> day2018_09_18
2018/09/21 17:41 <DIR> day2018_09_19
2018/09/22 15:10 <DIR> day2018_09_21
2018/09/24 21:16 <DIR> day2018_09_22
2018/09/27 18:16 <DIR> day2018_09_25
2018/10/13 17:41 <DIR> day2018_09_26
2018/10/19 18:13 <DIR> day2018_10_14
2018/10/25 16:57 <DIR> day2018_10_18
2018/10/25 21:00 <DIR> day2018_10_25
2018/10/26 16:18 <DIR> day2018_10_26
2018/09/07 16:44 <DIR> day2018_9_5
2018/08/16 16:59 <DIR> day3
2018/09/03 20:48 <DIR> day4
2018/09/03 20:53 <DIR> test
0 个文件 0 字节
29 个目录 67,621,523,456 可用字节
D:\1.pycharm>cd day2018_10_26
D:\1.pycharm\day2018_10_26>dir
驱动器 D 中的卷是 软件
卷的序列号是 0002-A33B
D:\1.pycharm\day2018_10_26 的目录
2018/10/26 16:18 <DIR> .
2018/10/26 16:18 <DIR> ..
2018/10/26 15:13 0 __init__.py
2018/10/26 16:18 773 反射.py
2 个文件 773 字节
2 个目录 67,621,457,920 可用字节
D:\1.pycharm\day2018_10_26>python 反射.py habit
Animal中没有这个类。。
D:\1.pycharm\day2018_10_26>python 反射.py Dog
狗类 吃粑粑。。
注:
|
3.setattr(object,name,values)
给对象的属性赋值,若属性不存在,先创建再赋值
(注:可用于给实例绑定方法)
import sys
class Animal(object):
Rabbit='兔子吃草。。略略略'
def __init__(self,name):
self.name = name
def Dog(self):
print('%s 吃粑粑。。' % self.name)
def Cat(self):
print('%s 喵喵叫。。' % self.name)
def Print_A(self):
self.Dog()
self.Cat()
def Tortoise(name):
print('%s 吃肉肉。。' % name)
def Tortoise1(self,name): # 这样就可以调用Animal里的属性或者方法了
print('%s 吃肉肉。。' % name,self.Rabbit)
if __name__=='__main__':
D = Animal('狗类')
C = Animal('猫类')
# D.Dog()
# C.Cat()
setattr(D, 'T', Tortoise) # D为实例,‘T’为给Dog1绑定到D的名字,Tortoise为被绑定的方法名
D.T('龟龟类') # 把方法绑定在实例上的
# C.T('龟龟类') 这里会调用失败,说明只是把Tortoise方法绑定在 D 实例上
setattr(C, 'T1', Tortoise1)
C.T1(C,'龟龟类') # 这里需要把如果Tortoise1里想要调用Animal里的东西需要把Animal或实例化了的C或D任意一个传进去
龟龟类 吃肉肉。。
龟龟类 吃肉肉。。 兔子吃草。。略略略
4.delattr(object,'name')
删除object对象的方法或属性
import sys
class Animal(object):
Rabbit='兔子吃草。。略略略'
def __init__(self,name):
self.name = name
def Dog(self):
print('%s 吃粑粑。。' % self.name)
def Cat(self):
print('%s 喵喵叫。。' % self.name)
def Print_A(self):
self.Dog()
self.Cat()
def Tortoise(name):
print('%s 吃肉肉。。' % name)
if __name__=='__main__':
D = Animal('狗类')
C = Animal('猫类')
# D.Dog()
# C.Cat()
setattr(D, 'T', Tortoise) # D为实例,‘T’为给Dog1绑定到D的名字,Tortoise为被绑定的方法名
D.T('龟龟类') # 把方法绑定在实例上的
# C.T('龟龟类') 这里会调用失败,说明只是把Tortoise方法绑定在 D 实例上
# delattr(D,'Dog') # D 是实例,无法删除Animal类里的方法
# delattr(Animal,'Dog') # 但是可以类删除里面的方法
# D.Dog() # AttributeError: 'Animal' object has no attribute 'Dog'
delattr(D, 'T') # 可以删除实例绑定的方法'T'
D.T('龟龟类')