通过字符串的形式操作对象的属性
class Person(object):def __init__(self,name,age) -> None:self.name=nameself.age=agedef walking(self):print("walking......")
获取对象的属性
p=Person("Recardo",12)
# 获取队形的name属性
a=getattr(p,"name")
# Recardo
print(a)
为对象添加static的属性
p=Person("Recardo",12)
# 添加static 属性的变量
setattr(p,"yanling","show me the flowers")
# show me the flowers
print(p.yanling)
为对象添加方法
p=Person("Recardo",12)
#对实例添加方法
def talking(self):print(self.name,"is talking")
# 为p对象添加名为speak的方法
setattr(p,"speak",talking)
# Recardo is talking
p.speak(p)
对Student类添加方法
p=Person("Recardo",12)
#对实例添加方法
def talking(self):print(self.name,"is talking")
#对Person类添加方法
setattr(Person,"speak2",talking)
# p对象调用Person类的方法
# Recardo is talking
p.speak2()
删除对象的变量
p=Person("Recardo",12)
# 相当于del p.age
delattr(p,"age")
# AttributeError: 'Person' object has no attribute 'age'
print(p.age)
输入对象的方法名,对象执行方法
class Person(object):def __init__(self,name,age) -> None:self.name=nameself.age=agedef walking(self):print(self.name," is walking......")p=Person("Recardo",12)
user_command=input(">>:").strip()
if hasattr(p,user_command):func=getattr(p,user_command)func()
"""
>>:walking
Recardo is walking......
"""
__name__属性
reflect2.py
"""
reflect2.py
magical reflect2
__name__
反射一个.py文件下的字符串的属性
"""class Person(object):def __init__(self,name,age) -> None:self.name=nameself.age=agedef walking(self):print("walking......")print("outside the __main__")
print(__name__)
#在被别的模块导入的时候,发挥作用,被导入时,__name__=="xxx.py"中的xxx
#不被导入时,__name__=="__main__"
if __name__=="__main__":print("inside the __main__")print(__name__)
"""
outside the __main__
__main__
inside the __main__
__main__
"""
此时,无论是main方法里面还是main方法外面,__name__都等于__main__
reflect4.py
import reflect2 as r2
运行reflect4.py
控制台打印:
outside the __main__
reflect2
此时,reflect2中的name是reflect2
夸文件反射
# reflect4.py
# 导入reflect2.py
import reflect2 as r2if hasattr(r2,"Person"):PersonClass=getattr(r2,"Person")p=PersonClass("ChenLuo",3)print(p.name)print(p.age)p.walking()"""
运行结果:
outside the __main__
reflect2
ChenLuo
3
walking......
"""