反射
dir() 拿到对象所有属性
https://zhuanlan.zhihu.com/p/99150129
1、反射有四个方法:hasattr、getattr、setattr、delattr,比较常用的是前两种,一般会结合起来用。
2、最最重要的一点:通过字符串去操作对象的属性和方法,是字符串形式!
什么对象可以用反射?
3、实例化对象、类、其他模块、本模块
4、只有以上四个才能使用,因为他们都能通过 . 的方式获取或调用,这也算是一种前提
实例化对象的反射操作
class A:
country = "中国"
area = "深圳"
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print(666)
a = A("Jane", 18)
# 对象的属性
print(a.name) # Jane
# 注意这个变量名也要用字符串形式!
print(hasattr(a, "name")) # True
# 不是这样用,而是字符串形式的属性名
print(hasattr(a, "Jane")) # False
# 一般 hasattr 与 getattr 结合起来使用
if hasattr(a, "name"):
print(getattr(a, "name")) # Jane
# 可以设置一个默认值,目的是防止程序报错
# 如果没有该属性,就返回默认值
print(getattr(a, "sex", None)) # None
print(a.country) # 中国
print(getattr(a, "country")) # 中国
ret = getattr(a, "func")
# 注意这里 ret() 相当于 func()
print(ret()) # 666
# 给对象添加一个属性
setattr(a, "sex", "男")
print(a.sex) # 男
# 删除对象的某个属性
delattr(a, "name")
print(a.name) # AttributeError: 'A' object has no attribute 'name'
类名的反射操作
class A:
country = "中国"
area = "深圳"
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print(666)
# 获取类 A 的静态属性 country
print(getattr(A, "country")) # 中国
# 获取类 A 的静态属性 area
print(getattr(A, "area")) # 深圳
# 获取类A 的动态方法并执行
getattr(A, "func")(23) # 666
网友评论