持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 getattr
之前虽然有用到类实例.dict,利用反射获取属性,但是里面可不可以通过名称获得这类里的show方法呢,结果如下图,是无法获取到show方法的。这时候该上getattr了,它的入参:1、成员对象,2、对象的方法,3、成员的名称(可以不写)。
getattr第一个参数传入d,第二个传入show字符串名称,如下图的结果来看,已经得到了想要的show方法了。
那它可不可以获取属性呢,如下图也是可以的。
getattr更加全面,不管是方法还是属性,它都可以获取到。 完整代码如下:
class Demo:
def __init__(self, a, b):
self.a = a
self.b = b
def show(self):
print("show")
d = Demo(1, 2)
print("\n __dict__ -->", d.__dict__)
print("getattr -->", getattr(d, "show"))
print("getattr属性 -->", getattr(d, "a"))
print("getattr属性 -->", getattr(d, "b"))
2 setattr
知道了getattr,其实介绍setattr和它类似的,如下代码:
这里的setattr(d, "b", 123)就可以等同于:d.b = 123。若是不存在的话,和__dict__方式类似,直接创建个,然后赋值就可以了。
class Demo:
def __init__(self, a, b):
self.a = a
self.b = b
def show(self):
print("show")
d = Demo(1, 2)
# print("\n __dict__ -->", d.__dict__)
print("getattr -->", getattr(d, "show"))
setattr(d, "b", 123)
setattr(d, "h", 123)
print("getattr属性 -->", getattr(d, "a"))
print("getattr属性 -->", getattr(d, "b"))
print("getattr属性 -->", getattr(d, "h"))
setattr(d, "show1", lambda x: x+1)
print("getattr -->", getattr(d, "show1"))
那么赋值方法可以不可以呢,答案是不可以的,从上图的结果,虽然我们也看到了,这里自定义的匿名函数,打印出来也生效,但是它是跟着这个实例来,而不是直接动态的添加到类的方法中的,如下图:
3 总结
getattr比__dict__,更加全面,属性和方法都能获取到,但是setattr不可以,它和__dict__类似,可以修改和创建属性,但是不能动态添加方法到类中,按照之前学习的,可以理解为属性是公有,但是方法是私有,也就说方法只能在这个具体的实例中使用。