Python,只会直撸小脚本,该如何运用面向对象编程思想写程序?
无经验小白,在看书看视频自学Python,杂七杂八写一些脚本,知道数组,列表,if,while,函数等。
最近卡壳在面向对象这一块,看书举例子,class 狗,class 人, 属性,方法都能明白,书上的例子也都照著敲过,现在的感觉就是「道理我都懂,就是不知道有什么用」
平日里写脚本都是一路撸到底,或者掺杂几个函数,不能明白面向对象编程到底有什么作用,而面向对象编程又是绕不开的内容。
-------------------------------------------------------
自己平时简单的脚本可以直接写下来没有面向对象编程的思想,如何把面向对象编程运用在平时的程序里面?
你好,我的建议是做项目+阅读Github上的框架(or 依赖库)的源码(当然根据个人能力,选择合适大小的项目)。
比如我学习Scrapy爬虫框架时(现在也还在看),许多机制在文档并没有描述清楚,因此需要阅读源码深入理解。在阅读过程中,你会发现框架设计包含大量的类,这些类中,有些是核心,而有些只是附庸,有些只是一个壳,等著你去继承覆写。在阅读过程中,你就能学习到,一个框架是如何通过类的封装组织起来的,它们之间的继承方式又是怎么样的,你还能学习到很多在入门书中看不到的高级用法。总之,阅读源码的好处很多。你只需要选择一个优秀的合适自己的项目即可。
同为初学者,回答不当之处还请指正。共勉。
老婆你坐在我对面不要动,让我看著你敲会代码
OOP涉及知识点略多,了解过封装继承多态介面吗?编程是循序渐进慢慢积累的,如果你有书,就先按著书里的内容看完它,如果真的在认真学习却还是不懂,那换本书吧,或者说换个语言。
因为你没有了解清楚,事物发展的规律。最开始的时候都是面向过程编程,那时候软体还谈不上多复杂,都是命令行程序,几百行C代码就算大了,随著硬体的发展,互联网的发展,软体越来越大,越来越复杂,逐渐变成了软体工程,一个软体产品也早就不是一个人开发,而是一个大团队协同开发,多个人一起写代码时,面向过程这种代码组织形式显然已经无法胜任,问题就是需求,在编程技术领域,不要单纯去考虑技术本身,而要了解历史背景,了解需求,每一种技术都不是心血来潮,都是为了解决某个问题,实现某些需求,就是这样人们才发明了面向对象的代码组织形式,还包括面向对象里面各种设计模式。
所以你的问题,实质上是小学生提问,学习微积分有什么用,能买菜吗?
等到你有需求的时候,等到你需要的时候你自然就会用,比如说游戏开发,做游戏基本都是面向对象,当你用面向过程的方法去写游戏时,当你代码一片混乱时,当你抓狂时,你自然明白面向对象是多么有用
先不要想什么面向对象。
面向对象是你对事物的理解和抽象,而语言只是表达了你的思想,有些语言写起来可能更简单些,有些麻烦一点。
也有些极端的语言,连Int都是对象,极其繁琐。
理解这个思想,C这种过程式语言也是可以写面向对象的代码的。
不要为了面向对象而面向对象,这是一个自然的事情。
当你代码写多了,发现代码中几个东西有共同点,或者关联,比如,有类似的属性,有差不多的行为,你就可以考虑重构代码,把相关的代码用面向对象的方法重写。
写完后可以测试对比。
当你写了足够多的代码后,可以先做些设计,先分析编程的对象,提炼共性,关联。
这时可以看看设计模式,把你的分析结果套用在模式里面。
当你有更多的碰壁经验后,可能你就要用到单例之类的特殊模式了。
总结,开始别想太多,你对要做的事情理解多了,自然就会有面向对象的思路,这时再去学,效果也是最好的。
我的答案极少给出具体代码,都是思路。
编程是可以自学的。
自学的能力很重要!
这行业变化太快,不断有新东西冒出来,不一定有用,也可能有用。或者,你加入一个新团队,不得不去用你不熟悉的东西。
实在没什么可做的,可以给自己出个小题目做,然后优化。
比如,表达红灯,绿灯。
最初版可能是文字,是不是可以做成图形化?谁说灯一定是圆的,方的不可以吗?立体的行不?
进一步的,控制红灯亮3秒,绿灯2秒,循环。
那可以做个配置不?
配置能否导入导出?配置写入资料库可以吗?配置可以加密吗?配置可以用记事本编写不?或者,做个配置工具?
初始状态是什么?
如何控制启停?
可不可以远程控制?
比如用一个网页控制。
能否做个摄像头识别当前的灯是什么?
把灯跟一个实际输入关联起来,比如是PLC的地址。
~~~~
可以脑洞很多。
我也是直撸小脚本,然后帮老婆做了一个小脚本减轻工作量,从一堆文本中提取关键信息,然后汇总到excel表中的功能;
一开始写的巨长,各种重复功能;
然后就用上了函数,然后又发现函数虽然能减少些重复内容,仍然存在可以复用的部分;
就用上了类;成功的减少了代码量,也加深了理解;
最近在研究装饰器,真难受!!!!!
继续撸脚本ing.....
我在学习python时,也经历过这样的迷茫。
我个人的解决方法是,自己创造一定的场景,来帮助自己去写代码。
比如,你可以尝试使用flask创建一个自己的网站,在这个过程中,你会学到面向对象的思想,前端的开发,资料库的链接等。
还可以创建一个爬虫,初学不要使用爬虫框架,这样的话,你能学到爬虫的原理,几个模块的构成,如果涉及分散式的话还有进程的通信等等。
当然,你可能觉得这些有点无聊,你也可以尝试使用pygame制作自己的小游戏。这样你可以学到游戏的事务机制等等。
这都是我在学python的时候的一点小经验,希望能够对你有所帮助。
[],(),{} :Python的这三个内置泛型实在是太强了以至于面向对象编程的好处在很多问题的解决中都体现不出来,尤其是你用Python当脚本用,而不是写库、写伺服器、写图形界面程序这些对数据封装有很强需求的用途。
你确实可以在Python不用class,但是代价是内存都是以靠你钦定的形式使用的。这意味著:哪一天你记不得自己是怎么组合用那些泛型的,亦或是别人要使用你的代码解决他的问题,但是却发现你的代码完全是一团散沙,根本不知道怎么实行拿来主义,这就出现了一个大灾难。
所以,严谨起见,你就打个包吧,这就是class的用处。
你对面向对象理解不够到位主要原因是代码写得太少或没参与过大项目,有过相应经历自然就好了。面向对象不是万能武器,不要为了用而用,随著你的学习和实践,会船到桥头自然直。对于你说的class 人狗的例子,稍微改造一下便于你理解。
增加一个class 哺乳动物。假设哺乳动物有移动、呼吸、吃、睡等一万个方法,class 狗和人继承哺乳动物,狗和人就有了一万个方法。单独为狗和人各写一万个相同的方法,工作量会增加一倍,如果你为动物园写代码,工作量可能会增加上百倍。而且一旦某个方法发生了变化(比如你的代码有bug),只改哺乳动物的方法即可,不需要改动狗和人(所有子类)。到这里,你理解了为什么要有父类。可能你会产生新的问题,所有方法写父类不就行了,不要子类了,写一个包含所有方法的万能父类。以狗和人的移动为例,狗用四条腿,人用两条腿,所以移动方法不应该使用父类的,而应该在子类重写。
你这个的话,能够经常用到的就是封装了,把你觉得的差不多的函数变数啥的用class装起来
跟普通函数比有什么好处呢?
你可以通过public,private,protected设定变数函数的许可权,把变数设置成private然后把操作这个变数的函数设成public,这样别人想要操作这个class里的变数只能通过你给的函数,而不能直接操作变数
然后后面的多态继承平时用到的就比较少一些,差不多算是代码重用吧,就是尽量少一些重复的东西
看你的工作是什么吧。如果是大型的软体开发,可能面向对象是比较容易应用的场景。
如果只是脚本的应用,那完全没有必要啊。
任何一种技术都不是通用的。软体开发里常讲 No silver bullet.
如果想把面向对象这事应用好,建议你先看一下软体系统分析的书,
多练习这种思维。
真正的问题,在我看来,不是你用Python或者用Java。
这些只是你思维表达的方式。你的思维是什么样的,就会写出什么样的程序。
玩Python 想著面向对象?
玩玩Java 或者 C# 之类马上就有感觉了;
用面向对象的语法
用django框架写一个CMS系统吧,会有成就感,会学到很多东西,比如网页等等
个人理解是,面向对象更多的是用来解决「代码复用」问题的。
初学者表示,学了一年基本没用到23333333从实战入手,先逆向工程一个大程序,然后一点一点学习骚操作
推荐阅读: