在上一篇文章中,我们介绍了 Python 的函数式编程,现在我们介绍 Python 的类和继承。

查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/10010690.html


先前,我们研究过两种编程范式--命令式(使用语句、循环和函数)和函数(使用纯函数、高阶函数和递归)。
接下来我们学习一个编程方式是面向对象编程 —— Object Oriented Programming,简称 OOP,这是一种程序设计思想。OOP 把对象作为程序的基本单元,类描述对象将是什么,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息并处理这些消息。计算机程序的执行就是一系列消息在各个对象之间传递。
类是使用关键字 class 和缩进块创建的,缩进块包含类方法(这些是函数)。

class Dog:
def __init__(self,name): #__init__传参数
self.name = name d1 = Dog("张三")
d2 = Dog("李四")
d3 = Dog("王五")
数据封装、继承和多态是面向对象的三大特点。

__init__方法
__init__方法是类中比较重要的方法,它在创建类的实例(对象)时调用,这种方法创建的属性我们称为实例变量。
类中所有方法都必须将 self 作为它们的第一个参数,尽管它没有显式传递,但是 Python 将 self 参数添加到列表中。在调用方法时不需要包含它。在方法定义中,self 引用调用该方法的实例。类的实例具有属性,这些属性是与实例关联的数据。
在本例中,Dog 实例将具有 nameeyes 的属性。可以通过实例后面加点和属性名来访问这些值。同样,在 __init__ 方法中,可以使用 self.attribute 来设置实例属性的初始值。

class Dog:
def __init__(self,name,eyes): #__init__传参数
self.name = name
self.eyes = eyes d1 = Dog("张三",2)
d2 = Dog("李四",2)
d3 = Dog("王五",2)
print(d1.name)
print(d2.name)
print(d3.name)
特殊方法 __init__ 前后分别有两个下划线!
在上面的实例中,__init__ 方法接受两个参数,并将它们分配给对象的属性。__init__ 方法称为类构造函数。

方法
类可以定义其他方法用来添加一些功能。请记住,所有方法都必须将 self 作为它们的第一个参数。使用点加属性的语法来访问这些方法。

class Dog:
def __init__(self,name,eyes): #__init__传参数
self.name = name
self.eyes = eyes def bulk(self):
print("%s:wang wang wang!" %self.name) d1 = Dog("张三",2)
d2 = Dog("李四",2)
d3 = Dog("王五",2) d1.bulk()
d2.bulk()
d3.bulk()

运行结果:

>>>
张三:wang wang wang!
李四:wang wang wang!
王五:wang wang wang!
>>>

类属性一种是通过 __init__ 方法来定义,也可以自己直接定义类属性,这种属性我们叫它类变量。它是通过在类的主体内分配变量创建的。可以从类的实例或类本身访问它们。

class Dog:
def __init__(self,name,eyes): #__init__传参数
self.name = name
self.eyes = eyes d1 = Dog("张三",2)
d2 = Dog("李四",2)
d3 = Dog("王五",2) print(d1.name)
print(d2.name,d2.eyes)
print(d3.eyes)

运行结果:

>>>
张三
李四 2
2
>>>
类变量由类的所有实例共享。

尝试访问一个实例中未定义的属性或方法会导致 AttributeError 异常。

class Student:
def __init__(self,id,name):
self.id = id
self.name = name man = Student(10086,"China")
print(man.id)
print(man.sex)

运行结果:

>>>
10086
AttributeError: 'Student' object has no attribute 'sex'
>>>

继承
通过在两个类中共享函数实现继承。
想像以下有些类,比如 Cat, Dog, Rabbit。尽管它们有一些不同,但是它们都有颜色,名字属性。
这些相同点可以通过继承父类 Animal 来实现这些共享的属性方法。继承最大的好处是子类获得了父类的全部功能。

class Animal:
def __init__(self,name,sex):
self.name = name
self.sex = sex class Cat(Animal):
def talk(self):
print('Neow!') func = Cat("ZS","F")
print(func.name)
func.talk()

运行结果:

>>>
ZS
Neow!
>>>

OOP 程序设计中,当我们定义了一个 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类 (Subclass) , 而被继承的 class 称为基类、父类或超类 (Base class、Super class)。
如果一个子类拥有一个和父类相同的属性和方法,我们称为重写 (override)。在代码运行的时候,总是会调用子类的方法。

class Animal:
def __init__(self,name,sex):
self.name = name
self.sex = sex def take(self):
print("Hello...") class Cat(Animal):
def talk(self):
print('Neow!') func = Cat("ZS","F")
print(func.name)
func.talk()

运行结果:

>>>
ZS
Neow!
>>>
上面例子中 Animal 是父类,Cat 是子类。

子类同样可以做为父类被继承,这样继承的子类拥有两个父类的方法和属性。

class A:
def func_A(self):
print("A 类") class B(A):
def func_B(self):
print("B 类") class C(B):
def func_C(self):
print("C 类") obj = C()
obj.func_A()
obj.func_B()
obj.func_C()

运行结果:

>>>
A 类
B 类
C 类
>>>
注意:尽量不要循环继承。

方法 super 用来在子类中代指父类,可以用于在实例的父类中找到具有特定名称的方法。

class Animal:
def msg(self):
print("It's a dog!") class Cat(Animal):
def talk(self):
print('Neow!')
super().msg() Cat().msg()

运行结果:

>>>
It's a dog!
>>>
Cat().msg() 调用父类的 msg 方法。

“你们纪念的只是过去,如果拉上你的各种同学到你面前,你们还是无话可说。”

Python学习手册之类和继承的更多相关文章

  1. 《Python学习手册》读书笔记

    之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...

  2. 《Python学习手册》读书笔记【转载】

    转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉 ...

  3. Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘

    Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...

  4. Python学习手册(第4版)PDF高清完整版免费下载|百度云盘

    Python学习手册(第4版)PDF高清完整版免费下载|百度云盘 提取码:z6il 内容简介 Google和YouTube由于Python的高可适应性.易于维护以及适合于快速开发而采用它.如果你想要编 ...

  5. 转载-《Python学习手册》读书笔记

    转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html

  6. global语句(python学习手册422页)

    # -*- coding: cp936 -*- #python 27 #xiaodeng #global语句(python学习手册422页) #实际上就是一个名为__builtin__的模块,但是必须 ...

  7. 《Python学习手册》(二)

    <Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...

  8. 参考学习《Python学习手册(第4版)》高清中文PDF+高清英文PDF+源代码

    看到第38章了,整体感觉解释详细,例子丰富:关于Python语言本身的讲解全面详尽而又循序渐进不断重复,同时详述语言现象背后的机制和原理:除语言本身,还包含编程实践和设计以及高级主题.边看边写代码.不 ...

  9. 读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」

    0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code之 ...

随机推荐

  1. easyUI datagrid 重复发送URL请求

    如果在table属性中配置了URL参数,在初始化datagrid时,会发送一次url请求.或者在js中datagrid{url:''}时,也会自动发送一次url请求. 在初始化datagrid时,我并 ...

  2. js判断客户浏览器类型,版本

    在JS中判断浏览器的 类型,估计是每个编辑过页面的开发人员都遇到过的问题.在众多的浏览器产品中,IE.Firefox.Opera.Safari........众多品牌 却标准不一,因此时常需要根据不同 ...

  3. 面向对象编程——parent—this

    PHP5 中使用 parent::来引用父类的方法. parent:: 可用于调用父类中定义的成员方法. parent::的追溯不仅于直接父类. PHP5 中为解决变量的命名冲突和不确定性问题,引入关 ...

  4. spring初始化完成后执行初始化数据方法

    Spring提供的解决方案三种: 1.InitializingBean package com.foriseland.fsoa.fabricca; import com.foriseland.fsoa ...

  5. 关于cmake输出动态链接库名字的问题

    使用cmake进行项目编译管理时,我们经常使用 add_library(foo SHARED foo.cpp) 这样的话,输出时,如果在win下面会得到foo.dll,linux下面会得到libfoo ...

  6. July 20th 2017 Week 29th Thursday

    The darkness is no darkness with you. 有了你,黑暗将不再是黑暗. The darkness will not be driven out if we failed ...

  7. 使用BAPISDORDER_GETDETAILEDLIST创建S/4HANA的Outbound Delivery

    要在S/4HANA里创建Outbound Delivery,首先要具有一个销售订单,ID为376,通过事务码VA03查看. 只用61行代码就能实现基于这个Sales Order去创建对应的outbou ...

  8. 汇编试验十五:安装新的int 9中断例程

    安装新的int 9中断例程(按'A'键后显示满屏幕的'A') int 9 是外中断,同样,程序编写还是和其他中断例程类似,安装(复制),调用: 不同点是在于,他要从端口读取数据60h, Source ...

  9. WMIC常用

    显示详细的进程信息 查找进程的具体路径 通过比较严查可疑文件 显示本机安装的软件

  10. 我的第一个C++程序

    准备抽空学习C++了,不知道自己以后能不能坚持下去,去百度查了一下入门,大多数朋友都是选择用VC++或者VS,而我这里用的是C-Free 5 ,安装包也只有十几兆. 用起来也方便.对于初学者而言够用了 ...