日月灿烂,若出其中,星汉灿烂,若出其里。 -- 曹操.观沧海 东汉末年

人类文明以降,总会有无数的人通过对世界的观察和思考去总结我们从哪里来,要往哪里去。

遥远的古代我们的祖先通过想象力把数字变成了符号,通过文字来描述周围的一切,用抽象思维定义世界万物。

100年前,我们在工业革命之后进入了信息化革命,我们通过工业时代的与非门逻辑电路开始定义第一台计算机并让其开始工作后,全球走向了信息化革命,浪潮席卷至今从不停歇。

上世纪60、70年代,自从诞生了以C语言为主流的高级编程语言后,我们开始进入了面向过程式的编程,所谓面向过程也可以说是面向函数编程。编程时分析问题的步骤1、2、3、4。分别为步骤编写不同的函数,然后按照一定的顺序把函数串联起来达到解决问题的目的,即为面向过程编程。

本章知识点面向过程和面向对象

什么都不的pass

类的解释

类的初始化函数

类的成员变量

类方法

关于实例化

关于类的参数

面向过程和面向对象

面向过程式的编程模式看起来像下面这张图,由一个主函数(人口函数)开始启动,然后在各种子函数之间进行串联,达到完成功能的目的。

再后来过了10多20年,面向对象式的编程开始逐步风靡,它在面向过程式的编程基础上更进化了一大步,我们开始像远古的祖先一样对万物进行归类,并试图用计算机语言去描绘它们。很多现代高级语言,Python,C++,JAVA,.Net之类的语言是面向对象编程的。

例如我们都是人类,但有的叫龙傲天,有的叫叶良辰,有的脾气好,有的脾气差,有的长得帅,有的长得壮等等千奇百怪的属性。

如果函数式编程,我们需要定义一个叫人类的函数,然后填充各种参数去定义这个函数,如下图所示。

我们通过成功的创建出四个人类,嗯,他们可以坐在一起打麻将庆祝澳门回归20周年了。

现在这四个人中王春花男士提出要求,希望改变他的性别为女性,因为他昨天打麻将作弊赢了钱想躲避别人追查,于是去了趟东南亚做了一个人体性征器官再造手术。

基于我们上面代码里的数据结构可能不太好处理这个问题,于是我们会想起之前学过的字典,它正好可以来存储每个人的信息,OK!改造一下。

妥了,我们添加了一个change_name的函数专门用于修改人物性别。

如果我们人物有100个可以修改的属性,我们就需要定义100个用于修改具体属性的函数来做这件事情,并用程序逻辑把这100个函数返回结果串联起来,在更大型的系统里,成千上万个函数时这就有点抠脑壳了。

我们之前提到过,懒惰是程序员的一大美德,那么我们如何真正抽象的来描述人类这个对象呢?

如果是在python的面向对象编程里,我们的基础代码看起来像这样。

记住这段代码,我们将在本章通过下面详细的解释这段代码来学习面向对象编程。

通过面向对象的思维编程,我们可以很轻易的修改人名或者性别或者任意属性,而不需要为这些属性额外提供相同数量的函数。

什么都不干

第一行有一个EmptyClass的类什么都没定义,就写在那摆着看,主要用途在于编程时占个位,有一个想法,但是还没想好怎么实现,先写一个名字,回头再来补上实现。

pass语句就是python里用于占位的语句,表示在代码区块里什么都不干,占个座。

在if, for, while, 函数,类,以及别的代码区块(以冒号开头的区块)里,如果什么都不写,语法会报错,所以需要用pass语句做个占位。

类的语法定义:

class Human():

def __init__(self,*args):

pass

在以这三行代码里我们发现定义一个类是用 class关键字开头,然后是类的名称,通常首字母大写开头。

在类名后面跟了一个括号,表示可以用来继承些类(继承的概念我们回头再讲),如果我们在设计时明确类不需要继承,也可以不加这个括号。

class Human:

def __init__(self,*args):

pass

这样定义一个类也是可以的。

那么到底什么类呢?

类的解释:

在python语言中,我们把一切都是视为对象,无论是各种数据类型,变量,函数甚至是类,它的本质也是python的对象而已。

而类就是对于对象的抽象定义。

我们可以结合前言,把类理解为一个对于具体事务的抽象描述。

例如我们把斑马,大象,狮子,蚂蚁,老鹰所有的动物可以归为一个类,class Animal(动物)。

然后我们可以通过 Animal(动物) 这个类创建出无数的对象,这些对象包含不同种类的属性和行为。狮子是猫科动物,吃肉,可以奔跑但是不能飞。

老鹰是鸟类,吃肉,可以飞。

这两种动物就都是Animal这个类创造出来的对象,并且即使是一种动物,也可以是有不同属性和行为的对象。

# 实例化狮子1

lion1 = Animal()

# 实例化狮子2

lion2 = Animal()

# 实例化老鹰1

eagle1 = Animal()

# 实例化老鹰2

eagle2 = Animal()

类的初始化函数

我们可以看到在Human类里,我们定义了一个类的初始化函数。

def __init__(self, *args):

类的初始化函数主要用处是在类被实例化时进行一些初始化的操作,例如设置一些通用的成员变量,调用一些类方法进行运算,打印一些日志信息等。

当然这些操作的逻辑由我们编程时自己决定是否需要,甚至一个类没有初始化函数也是可以的。

在python语言的类里,方法名前后由两条下划线包含起来表面它是一个内部方法,或者说内置方法,我们可以理解为,这些方法已经被python定义好了用途,我们只需要按照用途来实现它的具体逻辑即可。

例如init方法可以在类实例化的时候自动被启用,setattr和getattr分别用于修改和查看类的成员变量等等。以后我们会在单独的章节仔细讨论类的内部方法,在此不详细展开。

类的成员变量成员变量的定义就是变量本身希望在类的所有方法中被访问并修改到,那么就需要定义自己为成员变量,而非普通变量。

我们一般通过self.变量名的方式来定义类当中的成员变量并且可以在当前类的所有方法里通过self.变量名去访问和修改它,然后在类外部通过 实例化对象.变量名的方式 访问和修改它 。

如果在类当中某个方法定义普通变量,那这个变量的作用范围仅仅在方法内部,无法被其他方法使用,也无法在类外部通过 实例化对象访问到它。

类方法

在类里面所定义的函数我们称之为方法,为了跟普通的函数有一个叫法上的区分。

类方法和函数最明显的区别是类方法里可以共享整个类的成员变量,包括该类里所有方法中所定义的成员变量。这个是函数做不到的,函数和函数之间不能共享变量信息,只能通过调用和return的方式获取函数里传递出来的值。

举个例子先:

在以上例子中我们可以发现在method1类方法里定义了一个叫a的成员变量,然后在method2中对这个成员变量进行了修改,最后它的结果就变了字符串 '2'。这种特性大大的提高了我们对于数据的使用效率。

关于实例化

对类进行实例化就是我们基于某个类进行了具体的初始化操作,得到一个包含类的成员变量和内部方法的对象。

因为类本身是一个抽象性的描述,它可以为成千上万个相同种类但是属性千差万别的事物赋予实体。

就像女娲造人一样,我们人类的定义在她的脑子里,但是这个世界上没有一个真正的人类存在。

通过她的双手制造出各种各样的人,这个制造的过程,就是实例的初始化。

如果她觉得不满意,就拿回其中一个人,对他进行回炉重造,这个就是对类的属性进行修改。

最后我们可以简单的理解为,如果我们需要使用一个类,就必须先要实例化它。

换成一句通俗的话就是 “能动手就别BB”,你说得再好听先给我来点实际的,这句话如果发生在计算机世界里,那就是我们向类说的。实例化一个类的代码前文已经出现过很多次,就不再重复了。

关于类方法参数

我们发现在类方法的参数中,有一个叫self的对象,它实际上是用来作为一个访问类本身所有方法和成员变量的对象。

想象这么一个画面:

此时此刻,我给身边一个智力不太高,不能进行太多联想的同伴说了一句话:“我把我的手机解锁密码忘了!“

这里话里的关键词在于 我的,因为在我同伴看来,我也是这个世界万物中的一个对象,当我需要描述我自己的属性和动作时,我肯定要在前面加上一个明确的称谓 “我的”。

不然的话,我说:“我把手机解锁密码忘了!”。我这位智力不高的同伴可能会懵掉,他不知道我在说谁。

为什么我要说智力不高,不善于联系呢?因为这是我们人类和计算机一个显著的区别,我们总是需要给计算机明确的指令,它才会执行。否则它的联系总是不及人类那么周全。

有了这个解释后,我们在来说 self 这个对象,它就是类在需要用到自身的成员变量或者方法时向计算机说:“现在该调用我的xxx属性了,该调用我的xxx方法了。”

至于 第二个参数有一个星号前缀的变量 *args 是我为了传递参数时方便,当我不想在类方法里写全所有参数名或者根本不知道有多少参数信息会被传递进来时,就写一个星号前缀的变量,args这个命名也是我习惯了,可以是x别的变量名都行。

*args的用处是在函数或类方法里接受一个或多个参数,它返回一个 元组类型(tuple)的数据,我们可以通过取索引位置的方式分别把参数值取出来。当然这个用法的前提是我们知道传入参数的顺序。我们可以简单的理解为把变量传给函数或给类方法时对这些变量做了一个打包,N个打包成一个,在函数内部再去挨个拿出来。

今天关于python面向对象编程的基本概念就介绍到这,事实上对于面向对象编程来说,本章的知识点还远远不够,不过我们将来会有更多的时间深入面向对象编程,深入python之美。

我相信我们学习面向对象的过程,也是在学习如何高度抽象化去理解这个世界,生命不止,进化不同,与诸位共勉。

欢迎关注我 “纸飞机编程”,获取更多有趣的python教程信息。

python定义一个人类_python基础课程 第9章 面向对象编程(上) 一场人类进化史相关推荐

  1. python定义一个字符串_Python基础之字符串

    初识字符串 字符串的认识 首先,我们先认识下什么是字符串:# 定义字符串 t_str1 = "Hello World" t_str2 = "asdfghh" p ...

  2. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  3. python定义字典列表_Python基础语法(四)—列表、元组、字典、集合、字符串

    列表 基本概念列表是有序的元素集合,所有元素放在一对中括号中,用逗号隔开,没有长度限制: 列表索引值以0为开始值,-1为从未尾的开始位置. 列表可以使用+操作符进行拼接,使用*表示重复. 当列表元素增 ...

  4. 用python写一个函数_Python基础-函数篇

    1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派----> ...

  5. python定义一个数组_Python数组定义方法

    本文实例讲述了Python数组定义方法.分享给大家供大家参考,具体如下: Python中没有数组的数据结构,但列表很像数组,如: a=[0,1,2] 这时:a[0]=0, a[1]=1, a[[2]= ...

  6. python写一个类方法_Python基础|类方法的强制重写与禁止重写

    在Python中,类的继承与函数的重写,是我们再熟悉不过的知识点.但如何实现,方法的强制重写与禁止重写,这大概是很多初学者的一个知识盲区吧? 01 强制重写 需求:父类一个方法,强制子类去重写. 实现 ...

  7. python入门之运算符的使用的答案_python基础课程 第2章 (运算符)

    纸飞机编程 2019-12-09 17:11:26 算术运算符 加,减,乘,除 四个运算符是我们平时最常用的运算符 在Python中分别用+ - * / 四种符号来表示,运算优先级是先乘除再加减 取模 ...

  8. python定义一个变量_Python新手上车3:Python第一个程序和变量

    第一个程序 上节内容我们提到了如何安装Python 以及安装配置VSCode,这节内容我们继续介绍第一个程序的建立: 1.在VS的左上角点击建立一个新的程序,命名为 python_0301_code. ...

  9. python编写一个名片_python基础-实现名片功能

    (一)题名: # 编写程序,完成"名片管理器"项目 # 需要完成的基本功能: # 1 添加名片 # 2 删除名片 # 3 修改名片 # 4 查询名片 # q 退出系统 # 程序运行 ...

最新文章

  1. 商汤AI小学教材来了,动动手玩乐高就能搭建机器人
  2. STARTUPE2原语
  3. HackerRank Nimble Game
  4. 【README3】动态规划之“找零钱”说明最优子结构怎么解决
  5. End-to-End Object Detection with Transformers的部分解读
  6. 《R数据可视化手册》——2.5 绘制箱线图
  7. linux编写python脚本_在ubuntu linux 中编写一个自己的python脚本
  8. android api版本 闪退_解决 Android 升级 SDK API 27 过程中遇到的问题
  9. 嵩天python测验_考试 嵩天老师 :测验3: Python语法程序与设计(第3周)
  10. ⼤数据可视化技术:可视化技术概述与Echarts⼊⻔
  11. 闲聊企业数字化转型(1)-供应链数字化
  12. Jetson Nano 系列之:25FPS性能优化之路
  13. html怎么做彩虹渐变,PS彩虹怎么做?|渐变工具制作彩虹方法教程
  14. Week8 CSP模拟 T2 HRZ学英语
  15. BUUCTF-[安洵杯 2019]easy_web1
  16. python爬虫爬取网易云音乐歌曲_Python网易云音乐爬虫进阶篇
  17. Unity3d开发之十二:邮箱正则验证js和c#
  18. python中的装包与解包*,**
  19. 【机器学习的数学基础】(十五)信息论
  20. fluent 对电机油冷分析_车用油冷电机温度场分析

热门文章

  1. 数据可视化分析教学课件——FineBI实验册节选====交通运输及物流管理等专业
  2. 解决: 未能加载文件或程序集“Microsoft.Practices.EnterpriseLibrary.Data,
  3. 联通156号段正式放号 尾号六位相同号月最低消费两万元
  4. 【考研】2018-Part B 作文(英一)
  5. 小学计算机学科工作计划,2023年小学信息技术学科工作计划
  6. 【flutter-mobx】Flutter 状态管理- 使用 MobX实现计数器
  7. 微型计算机显示器的标准接口,下列哪一个不是微型计算机显示器的标准接口()。A.AGPB.PCI-EC.DVID.IDE...
  8. 你一定要知道的5款交互原型设计工具
  9. Jenkins使用 -- 用户设置
  10. 大学期间开发了一款App!让我月薪破万....