《微信背后的产品观》里,微信之父张小龙说:
对于非开发的同事,不妨也去学习一下怎么写程序。不是说真的要去做写程序的工作,而是希望可以了解一下面向对象的思路。......是否抽象到“足够抽象”的状态,如果没有抽象到这种状态,就会把事情做得很复杂,甚至会失控。
所以,除了新生代农民工里的搬砖崽,了解一下面向对象这个概念是百利无一害的。
什么是面向对象编程?
程序设计思想有面向对象(Object Oriented)和面向过程(Procedure Oriented)两大类。
面向过程是一次性的事,面向对象是关于某个主体有一堆过程的实现。比如,对于历史的描述,面向过程更像是编年体、发生一次动作就重新叙述一遍,而面向对象就像是纪传体,围绕人来展开历史故事的叙述。
那么,Python 这门编程语言又是怎么体现面向对象的呢?
Python 面向对象包括封装、继承和多态这三个特性。
封装是把每个对象有关的行为封装在一个模块中;
继承是说对象2在对象1的特点基础上有延续和扩展;
多态是指,对象1和对象3在同一个动作命令下有不同的实现和处理方式。
Python可以很好的支持面向对象编程。也就是说,你可以把某个对象的一些操作封装在一个类里。通过对类的调用、继承和改写,来实现程序的复用。
下面我们来看一个非常简单的例子,有一家公司叫 “小匚科技”,员工只有三个人:甲、乙、丙。
然后我希望这个公司的每个人都有两个基础属性,一个是工号,一个是姓名,于是可以这样定义:
接着来调用,需要传入参数,姓名和工号。
stuff1 = CodeStuff("甲","238493")
stuff2 = CodeStuff("乙","173646")
stuff3 = CodeStuff("丙","783901")
然后我们就可以对 stuff1、2、3后面加“.属性名”,来查询初始化属性。
在定义类的属性时,属性前面加两个下划线,表示私有属性,只能通过类里面的方法来返回,如:
公司员工刚入职,可能只有姓名和工号的属性,但是一定还有其他动作。
定义一下,公司所有人都是正常放双休的。不同的员工,在周末做的事情不一样。可以在类的基础上,继续扩展。
此时,父类,也就是最前面定义这个 CodeStuff类,新增了 workday_act, weekend_act 两个动作。
大家平时好好上班,周末好好休息。
接着,我们定义 小匚科技 不同职责的员工的动作:
# 产品,平时的工作和周末的动作:
class ProductStuff(CodeStuff): # 在括号里加上前面定义过的类,表示一种继承,具备父类里的内容,比如init不用再写一遍
# 重写父类方法
def workday_act(self):
print(self.name + "平时玩手机,发现新需求、做竞品调研、写文档、画图")
def weekend_act(self):
print(self.name + "周末白天出去玩、晚上视频号直播倾听用户反馈")
# 开发人员的动作:
class DevelopmentStuff(CodeStuff):
# 接着重写 假设这个开发比较上进
def weekend_act(self):
print(self.name + "周末学极客时间,刷 LeetCode,做肩颈运动,保护颈椎")
定义好后,调用一下看看:
和没有具体身份的员工来做一个对比:
开发人员没有定义工作日的动作,只定义了周末的,因此工作日的行为和父类一样:
这三个员工,我们都调用了同样的方法名,但是由于大家根据职位对方法进行了改写,所以,输出结果也有所不同。这就体现了多态。
希望本文能帮你建立"面向对象"的初步认知。不知道你看完以后有没有觉得不过如此,非常想动手试一下?但是又苦于之前从没接触过“编辑器”、“环境变量”这些概念。
不要急,请接着看。
在网页跑代码
我在这免费分享给大家一个不用配置复杂的安装环境、就可以跑 Python 代码的方法。
可以去找在线的数据比赛,只需要注册一个账号,就可以去比赛网站上提供的代码练习的地方来跑代码。
优点:
1 云同步:随时随地,同步在个人账号,一般也是云保存的,不用担心丢失和文件存储混乱而找不到;
2 版本隔离:在跑神经网络时,可能会遇到很多第三方库的版本不兼容问题(想要跑一下网上现有的代码的时候,会出现 TensorFlow1.0版本必须要卸载掉原有的numpy13.0,keras 又需要tensor2.3.0版本及以上)。在线上实验室,你就可以随意去折腾各种版本的包,不用担心搞乱的本地的(非要本地跑,推荐构造多个虚拟环境);
3 见贤思齐:更方便的 Fork(复制)网上优秀的代码来做模仿练习和调试。
缺点:
读取文件比较繁琐、偶尔会卡。
如果在Google Colab,每次要读取文件,都需要通过以下代码进行附件的上传:
from google.colab import files
uploaded = files.upload()
放下手机,拿起电脑,敲起好听的键盘声吧~
参考链接如下:
1 面向对象编程:https://www.liaoxuefeng.com/wiki/1016959663602400/1017495723838528
https://www.runoob.com/python/python-object.html
2 Colab链接:
https://colab.research.google.com/【手写字项目教学https://codelabs.developers.google.com/codelabs/cloud-tensorflow-mnist#1】
3 阿里天池实验室:https://tianchi.aliyun.com/notebook-ai/?spm=5176.12281949.J_9711814210.11.529324489Kp1XX