本节内容
- 概述
- 反射函数
- 综合使用
一、概述
反射我们以后会经常用到,这个东西实现了动态的装配,通过字符串来反射类中的属性和方法
二、反射函数
2.1 hasarttr(obj,name_str)
作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() print ( hasattr (d,choice)) #obj中是否有对应的choice字符串的属性或者方法 #输出 >>>:name #输入对象存在属性 True >>>:eat #输入对象存在的方法 True |
2.2 getattr(obj,name_str)
作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() print ( getattr (d,choice)) #choice获取obj对象中的对应方法的内存地址或者对应属性的值 #输出 >>>:name #返回name属性的值 shabi >>>:eat <bound method Dog.eat of <__main__.Dog object at 0x00000157A129CF28 >> #返回eat方法的内存地址 |
2.3 setattr(x,y,z)
作用:给obj对象添加一个新属性或者新方法,setattr(x, 'y', v) is equivalent to ``x.y = v''
①给对象新增一个新方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def bulk( self ): #先定义一个bulk函数 print ( "{0} is yelling..." . format ( self .name)) class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() setattr (d,choice,bulk) #输入的是talk,所以又等同于d.talk = bulk #d.talk(d) 直接写死,用d.talk(d),一般不这么写 func = getattr (d,choice) #用getattr来获取 func(d) #输出 >>>:talk shabi is yelling... |
②给对象新增一个属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() setattr (d,choice, 22 ) #输入的是age,所以又等同于d.age = 22 # print(d.age) 这样就写死了,还是用下面一种 print ( getattr (d,choice)) #输出 >>>:age 22 |
2.4 delattr(x,y)
作用:删除obj对象中的属性或者方法,delattr(x, 'y') is equivalent to ``del x.y''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() delattr (d,choice) #根据字符串删除属性或者方法 print (d.name) print (d.eat) #输出 >>>:name #删除属性name Traceback (most recent call last): File "E:/PycharmProjects/pythontest/day7/反射/反射.py" , line 22 , in <module> print (d.name) AttributeError: 'Dog' object has no attribute 'name' >>>:eat #删除方法eat Traceback (most recent call last): File "E:/PycharmProjects/pythontest/day7/反射/反射.py" , line 21 , in <module> delattr (d,choice) AttributeError: eat |
三、综合使用
3.1 综合使用hasattr、getattr、setattr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class Dog( object ): def __init__( self ,name): self .name = name def eat( self ,food): print ( "{0} is eating...{1}" . format ( self .name,food)) d = Dog( "shabi" ) choice = input ( ">>>:" ).strip() if hasattr (d,choice): #判断d对象中存在属性和方法 name_value = getattr (d,choice) #获取属性值 print (name_value) setattr (d,choice, "hong" ) #修改属性值 print ( getattr (d,choice)) #重新获取属性的值 else : setattr (d,choice, None ) #设置不存在的属性值为None v = getattr (d,choice) print (v) #输出 >>>:name shabi hong >>>:abc None |