认真的写博客真的是一件相当费体力和脑力的事情,对于Python老实博主说也是在一边学一边摸索其中的所以然,所以错误纰漏在所难免,欢迎指正,另博主要花好几个通宵去研究Python中的一个个知识点,然后总结出来成博文,所以希望各位转载的时候能够尊重Po主的劳动成果,转载时请注明,谢谢。
在python中类的编写很简单,但是要理解OOP的思想并以此去编写类才是我们真正需要去做的,这并非一朝一夕就能达到,需要长时间的去Coding,去总结,去实践。废话少说,我们来看Demo:
在这个Demo中,我们只做了一些简单的不能再简单的事情,当然还有更多的更重要的知识点等着我们去探讨,接着再看
严格来说,接下来我们要讨论的东西并不能放到Python类这一小节,但是为了更好的讲解清楚,PO主还是决定先说一下这个,我们都知道,无论是在C/C++,Java还是其他的一些语言,都会有一个运行的入口地址,或者说就是主函数,而Python作为一门脚本语言的灵活性这个时候就体现出来了。简单的说明一下如何体现的,并以一个例子作为辅助说明。
1.首先需要弄清楚的是模块的内置属性,简单的来说,模块的属性就是将模块的一些重要信息的说明封装了,使得调用者能够通过属性调用知晓,那么如何知道一个模块具有哪些内置属性呢?我们来看一下:
关于模块的调用不再赘述,有兴趣的可以去看看我的上一篇博文,我们重点关注这几个,dir,__name__,’test’,忘了说,我这里的demo.py模块就是刚刚写的那个类。看到dir,应该能够见名知意了吧,不错,我们就是通过它来获取当前的模块具有哪些属性,需要注意的是,不要把模块的属性与类里面的属性弄混了。仔细观察,我们会发现,第一个属性,最后一个属性有点眼熟,当然,第一个属性就是我们的类名,为什么类名也会在这里,其实也很简单,只要我们把模块当成一个更高的作用域,因为我们在模块里面定义了一个类,当然就出现了,同理,最后一个属性就是我们的对象名,这是为什么,还记的我们也生成了一个类的对象test么,凭什么说我这么说就是正确的?我们来验证一下,还是原来的味道,还是原来的配方,稍微添加一个类,然后多生成几个对象,最好在写个无关的顶层函数,看看有木有函数名不就知道了。
我们再来看一看dir(D)里面会出现什么(别忘了改动之后reload一下哦):
果不其然,验证了我们的猜想,(po的学习里程就是,一边看书,一边查资料,一边探究,一边猜想,一边验证,一边开心),好了,下面我们要去探究另一个东西了,就是跟主题有点关系的那啥__name__,(其他的属性以后有时间在探究,或者有兴趣的各位自己去查查看它们的作用是什么)。我们在交互式命令行下,先看一下这个name属性的值是什么:
很好理解,这里的name当然指的就是我们的模块名了,至于这里为什么是python.demo而不是demo,我想也很好解释,这里的name针对的是import 后面的东西,也就是说你要是import demo,那么该值就是demo ,我们试一下看看:
现在又有一个问题了,这个__name__有什么用?难道真的就是一个花瓶,给人家看看你的模块名么?那可不好说,我们来看一下一个奇怪的事情,我们现在在python自带的脚本编辑器中来运行一下刚刚我们的代码,我们不做任何其他改变,只是在结尾处打印一下__name__的值:
这个时候,我们会惊讶的发现,这不科学,为什么这里会是__main__呢?这正是我下面要解释的,希望以后学习python的朋友能因此而明白。
2.在python中,模块(*.py)既可以本身执行,也可以作为外部调用来执行,前面讲了那么多废话,无非就是下面两句话,当模块作为外部模块进行调用的时候,模块的__name__属性值就为模块名,当自身执行的时候,__name__属性值为__main__,当我们在一个模块内使用__name__属性判断时候等于__main__的时候,其实就是在判断整个工程的入口地址,所以,就算你在所有模块中都添加了if __name__==__main__及其后面的语句,都没关系,因为整个工程一个的__name__只有一个等于__main__,不用担心其他的会被执行。我们用一个简短的例子来结束这一小节:
当我们单独执行demo.py的时候:
当我们通过模块test来调用的时候是这样的:
注意:
模块的第一次调用过程相当于模块的执行