python笔记 专有方法

58 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 参考文章

Python type Class

Python:type、object、class与内置类型

2 正文

class Demo:
    pass

def main():
    print(dir(Demo))

if __name__ == "__main__":
    main()

通过dir()得到Demo所有公有成员,样式都是__属性或方法__的形式。 image.png

这里的__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()

image.png

image.png

当我们实例没有__name__时,demo.__name__会报错,但是我又不想它报错以及自己不想再去单独去定义它,我们可以用类的名称的代替。如下代码和图:

print("实例.__name__ ", demo.__class__.__name__)

image.png

3 总结

在他人的项目,会见到这种__方法或属性__调用,需要区分类.__方法或属性__实例.__方法或属性__,比如这里的__doc__,不需要去区分,但是这里的__name__需要区分的,不然一不留神给你找不到,当然为了避免这种麻烦,并且希望用默认的类名的话,可以实例.__class__.__name__,有人会问了,为啥不直接使用类.__name__呢,假如我的类很多,并且相应的实例也多,现在又加个好几个类,类.__name__也没问题,但是我定义多个实例,都要name名,总不能肉眼或程序判断,那我们完全可以实例.__class__.__name__,自动根据实例找到类名,它不是更体贴嘛,当然这里只是比方,正常__name__用的很少。