动态设置属性,有时候也会叫反射(java里面这样叫)
一、hasattr–判断属性是否存在
语法:hasattr(类/对象,“属性名”)
class Dog:
def __init__(self,name,age):
self.name = name
self.age = age
print("我的狗子是{},它{}岁了".format(name,age))
def run(self):
print("狗类会跑!!!")
def catch_mouse(self):
print("狗类会抓老鼠!!!")
my_dog = Dog("柴犬",2)
# 检查对象是否有属性名name
a = hasattr(my_dog,"name")
print(a)
# 检查类是否有属性名kind
b = hasattr(Dog,"kind")
print(b)
运行后:
二、getattr–获取属性
语法:getattr(类/对象,“属性名”,没有该属性时返回的值)
注:若属性不存在时,未指定返回值,此时会报错
class Dog:
kind = "狗"
sex ="公"
color = "黄"
def __init__(self,name,age):
self.name = name
self.age = age
print("我的狗子是{},它{}岁了".format(name,age))
def run(self):
print("狗类会跑!!!")
def catch_mouse(self):
print("狗类会抓老鼠!!!")
my_dog = Dog("柴犬",2)
# 获取对象的属性name
a = getattr(my_dog,"name")
print(a)
# 获取类的属性kind
b = getattr(Dog,"kind")
print(b)
# 获取类没有的属性wang
c = getattr(Dog,"wang","没有这个属性呢")
print(c)
运行后;
三、setattr–设置属性
语法:setattr(类/对象,“属性名”)
动态给对象/类设置属性,如果属性存在则修改属性的值;如果不存在,添加属性
class People:
sex = "男"
def __init__(self,name):
self.name = name
p = People("luban")
# setattr 如果属性存在,修改属性值。如果不存在,添加属性。
# 类属性不存在,添加类属性
setattr(People,"kind","黄种人")
print(People.kind)
# 类属性存在,修改类属性值
setattr(People,"sex","女")
print(People.sex)
print("=================================")
# 对象属性不存在,添加属性
setattr(p,"age",29)
print(p.age)
# 对象属性存在,修改属性值
setattr(p,"name","houyi")
print(p.name)
运行后:
四、delattr–删除属性
语法:delattr(类/对象,“属性名”)
① 删除动态添加的属性
class People:
sex = "男"
def __init__(self,name):
self.name = name
p = People("luban")
# setattr 如果属性存在,修改属性值。如果不存在,添加属性。
# 类属性不存在,添加类属性
setattr(People,"kind","黄种人")
print(People.kind)
# 删除动态添加的类属性
delattr(People,"kind")
print(People.kind)
运行后报错;
② 删除类定义时的属性
class People:
sex = "男"
def __init__(self,name):
self.name = name
p = People("luban")
# 删除类定义时的属性
delattr(People,"sex")
print(People.sex)
运行后报错: