持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 参考文章
2 正文
class Demo:
pass
def main():
print(dir(Demo))
if __name__ == "__main__":
main()
通过dir()得到Demo所有公有成员,样式都是__属性或方法__的形式。
这里的__xxx__分别被Demo类和它的实例调用。观察它们的打印结果,如下图所示。看出不同了吧,现在看代码,从打印认识这里的下一行开始,先定义了一个dmeo实例,这里的类和实例都打印了__class__,demo.__class__就是Demo这个类,Demo.__class__得到一个<class 'type'>。这里的__name__,由于demo实例没有name,会报错,所以注释了,你可以自行添加, Demo.__name__代表是类名(类的名字比如Demo)。__doc__文档,实例.__doc__来自于类文档。Demo.__doc__文档。如下图数字那个箭头的位置,一旦我赋值给了类.__doc__,两个都变了。这里的__module__表示模块名或者理解为输出当前对象所在位置的文件的名称。
class Demo:
pass
def main():
print(dir(Demo))
print("-- 认识 --")
demo = Demo()
print("demo.__class__ -->", demo.__class__)
print("Demo.__class__ ==>", Demo.__class__)
# print("demo.__name__ -->", demo.__name__)
print("Demo.__name__ ==>", Demo.__name__)
print("demo.__doc__ -->", demo.__doc__)
print("Demo.__doc__ ==>", Demo.__doc__)
print("demo.__module__ -->", demo.__module__)
print("Demo.__module__ ==>", Demo.__module__)
if __name__ == "__main__":
main()
当我们实例没有__name__时,demo.__name__会报错,但是我又不想它报错以及自己不想再去单独去定义它,我们可以用类的名称的代替。如下代码和图:
print("实例.__name__ ", demo.__class__.__name__)
3 总结
在他人的项目,会见到这种
__方法或属性__调用,需要区分类.__方法或属性__和实例.__方法或属性__,比如这里的__doc__,不需要去区分,但是这里的__name__需要区分的,不然一不留神给你找不到,当然为了避免这种麻烦,并且希望用默认的类名的话,可以实例.__class__.__name__,有人会问了,为啥不直接使用类.__name__呢,假如我的类很多,并且相应的实例也多,现在又加个好几个类,类.__name__也没问题,但是我定义多个实例,都要name名,总不能肉眼或程序判断,那我们完全可以实例.__class__.__name__,自动根据实例找到类名,它不是更体贴嘛,当然这里只是比方,正常__name__用的很少。