Python动态获取和设置对象属性
1、打开Python开发工具IDLE,新建‘attr.py’文件,并写代码如下:
class animal():
def __init__(self,zhonglei,name):
self.zhonglei = zhonglei
self.__name = name
@property
def name(self):
return self.__name
animal1 = animal('cat','xiaohua')
print (getattr(animal1,'name'))
定义了animal类,__name代表私有字段,私有字段一般通过属性方式来访问,定义了name属性,但是当属性未知时,就要通过getattr方式来访问

2、F5运行程序,打印出name属性值,getattr函数传递两个参数一个是对象,一个是属性名,注意是字符串格式,而不是变量格式

3、类比一下不用getattr的方式,代码如下:
class animal():
def __init__(self,zhonglei,name):
self.zhonglei = zhonglei
self.__name = name
@property
def name(self):
return self.__name
animal1 = animal('cat','xiaohua')
print (getattr(animal1,'name'))
print (animal1.name)

4、F5运行程序,同样打印出name的属性值,可能有疑惑,为什么还要用更复杂的getattr方式,这就是当使用别人写好的框架,无法知道都有哪些字段属性时候使用。

5、除了getattr,还有setattr设置属性值,代码如下:
class animal():
def __init__(self,zhonglei,name):
self.zhonglei = zhonglei
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def setname(self,name):
self.__name = name
animal1 = animal('cat','xiaohua')
setattr(animal1,'setname','xiaohuang')
print (getattr(animal1,'name'))

6、F5运行程序,setattr把程序初始化的name值改了

7、还有一个判断时候有某个属性的函数hasattr,有返回True,没有返回False.
代码如下:
class animal():
def __init__(self,zhonglei,name):
self.zhonglei = zhonglei
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def setname(self,name):
self.__name = name
animal1 = animal('cat','xiaohua')
setattr(animal1,'setname','xiaohuang')
print (getattr(animal1,'name'))
print (hasattr(animal1,'name'))
print (hasattr(animal1,'setname'))
print (hasattr(animal1,'abc'))

8、F5运行程序,animal1对象有name和setname属性,没有abc属性
