文章目录

  • 类和对象
  • 面向对象的过程
  • 定义类
  • 创建和给对象发消息
  • 打印对象
  • 面向对象编程的支柱
  • 经典案例
    • 例子1:定义一个类描述数字时钟,可以显示时/分/秒,可以运转(走字)
    • 例子2:扑克游戏:四个玩家参与,先洗牌,再把牌发到四个玩家手上

在面向对象编程的世界里,程序中的 数据和操作数据的函数是一个逻辑上的整体,我们称之为 对象对象可以接收消息,解决问题的方法就是 创建对象并向对象发出各种各样的消息;通过消息传递,程序中的多个对象可以协同工作,这样就能构造出复杂的系统并解决现实中的问题。

类和对象

面向对象编程:把一组数据和处理数据的方法组成对象,把行为相同的对象归纳为,通过封装隐藏对象的内部细节,通过继承实现类的特化与泛化,通过多态实现基于对象类型的动态分派。

类是一个抽象的概念,对象是一个具体的概念类是对象的蓝图和模板,对象是类的实例

在面向对象编程的世界中,一切皆为对象对象都有属性和行为每个对象都是独一无二的,而且对象一定属于某个类。对象的属性是对象的静态特征,对象的行为是对象的动态特征。按照上面的说法,如果我们把拥有共同特征的对象的属性和行为都抽取出来,就可以定义出一个类。

面向对象的过程

面向对象编程:

​ 1、定义类 —> 类的命名使用驼峰命名法(每个单词首字母大写)

​ — 数据抽象:找到对象相关的静态特征(属性) —> 找名词
​ — 行为抽象:找到和对象相关的动态特征(方法) —> 找动词
​ 2、造对象
​ 3、发消息

定义类

class Student:# 数据抽象def __init__(self, name, age):"""初始化方法"""self.name = nameself.age = age# 行为抽象def eat(self):"""吃饭"""print(f'{self.name}正在吃饭')def study(self, course_name):print(f'{self.name}正在学习{course_name}.')def play(self, game_name):print(f'{self.name}正在玩{game_name}.')

创建和给对象发消息

# 创建对象 ---> 构造器语法 ---> 类名()
stu1 = Student('小红', 17)
stu2 = Student('小白', 19)# 给对象发消息(调用对象的方法)
Student.study(stu2, 'Python程序设计')   # 小白正在学习Python程序设计
stu1.eat()                             # 小红正在吃饭stu2.play('王者荣耀')                   # 小红正在玩王者荣耀# 修改年龄
stu1.age = 20

打印对象

上面我们通过__init__方法在创建对象时为对象绑定了属性并赋予了初始值。在Python中,以两个下划线__(读作dunder)开头和结尾的方法通常都是有特殊用途和意义的方法,我们一般称之为魔术方法魔法方法。如果我们在打印对象的时候不希望看到对象的地址而是看到我们自定义的信息,可以通过在类中放置__repr__魔术方法来做到,该方法返回的字符串就是用print函数打印对象的时候会显示的内容,代码如下所示。

class Student:# 数据抽象def __init__(self, name, age):"""初始化方法"""self.name = nameself.age = age# 行为抽象def eat(self):"""吃饭"""print(f'{self.name}正在吃饭')def study(self, course_name):print(f'{self.name}正在学习{course_name}.')def play(self, game_name):print(f'{self.name}正在玩{game_name}.')def __repr__(self):return f'{self.name}: {self.age}' def main():    stu1 = Student('小青', 20)print(stu1)        # 小青: 20students = [stu1, Student('小蓝', 16), Student('小白', 25)]print(students)    # [小青: 40, 小蓝: 16, 小白: 25]if __name__ == '__main__':main()

面向对象编程的支柱

面向对象编程的四大支柱:

  • 抽象:提取共性(定义类就是一个抽象过程,需要做数据抽象和行为抽象)。
  • 封装:把数据和操作数据的函数从逻辑上组成一个整体(对象)。隐藏实现细节,暴露简单的调用接口。
  • 继承:扩展已有的类创建新类,实现对已有类的代码复用。
  • 多态:给不同的对象发出同样的消息,不同的对象执行了不同的行为。

经典案例

例子1:定义一个类描述数字时钟,可以显示时/分/秒,可以运转(走字)

import os
from time import sleepclass Clock:def __init__(self, hour=0, minute=0, second=0):self.hour = hourself.minute = minuteself.second = seconddef show(self):"""显示当前时间"""return f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d}'def run(self):"""走字"""self.second += 1if self.second == 60:self.second = 0self.minute += 1if self.minute == 60:self.minute = 0self.hour += 1if self.hour == 24:self.hour = 0if __name__ == '__main__':c1 = Clock(1, 58, 58)while True:os.system('cls')print(c1.show())sleep(1)c1.run()

注意:运行时使用终端运行python 文件名命令。

例子2:扑克游戏:四个玩家参与,先洗牌,再把牌发到四个玩家手上

分析:由题目可以抽取出三个类,分别是牌类、扑克类、玩家类,各自的属性和行为如下:

牌(Card)

  • 属性:花色(suite)、点数(face)

  • 行为:显示

扑克(Poker)

  • 属性:保存牌的列表
  • 行为:洗牌(shuffle)、发牌(deal)

玩家(Player)

  • 属性:名字(昵称)、保存玩家手牌的列表
  • 行为:摸牌(get)、整理(arrange)

魔术方法(魔法方法)—> 有特殊用途和意义的方法
~__init__ —> 初始化方法,在调用构造器语法创建对象的时候会被自动调用
~ __str__ —> 获得对象的字符串表示,在调用print函数输出对象时会被自动调用
~ __repr__—> 获得对象的字符串表示,把对象放到容器中调用print输出时会自动调用
—> representation
~ __lt__—> 在使用 < 运算符比较两个对象大小时会自动调用

如果一个变量的取值只有有限个选项,可以考虑使用枚举类型。
Python中没有定义枚举类型的语法,但是可以通过继承Enum类来实现枚举类型。
结论1:枚举类型是定义符号常量的最佳选择!!!
结论2:符号常量(有意义的名字)总是优于字面常量!!!

牌类

"""
example06 - 扑克游戏,四个玩家参与,先洗牌,再把牌发到四个玩家的手上。
Author: yucui
Date: 2021/8/5
"""
from enum import Enum# 枚举类型
class Suite(Enum):SPADE, HEART, CLUB, DIAMOND = range(4)class Card:"""牌"""def __init__(self, suite, face):self.suite = suiteself.face = facedef __str__(self):return self.show()def __repr__(self):return self.show()def __lt__(self, other):if self.suite == other.suite:return self.face < other.facereturn self.suite.value < other.suite.valuedef show(self):"""显示"""suites = ['♠', '❤', '♣', '♦']faces = ['', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']return f'{suites[self.suite.value]}{faces[self.face]}'def main():"""程序入口"""card1 = Card(Suite.HEART, 1)card2 = Card(Suite.SPADE, 13)print(card1, card2)print(card1 is card2)card3 = Card(Suite.DIAMOND, 9)card4 = Card(Suite.CLUB, 11)print(card3.show(), card4.show())card1 = card2print(card1, card2, card3)# 身份运算符print(card1 is card2)print(card1 is card3)cards = [card1, card2, card3, card4]print(cards)if __name__ == '__main__':main()

扑克类

"""
example07 - 扑克
Author: yucui
Date: 2021/8/5
"""
import randomfrom example06 import Card
from example06 import Suiteclass Poker:"""扑克"""def __init__(self):self.cards = [Card(suite, face)for suite in Suitefor face in range(1, 14)]self.counter = 0def shuffle(self):"""洗牌"""self.counter = 0random.shuffle(self.cards)def deal(self) -> Card:"""发牌"""card = self.cards[self.counter]self.counter += 1return carddef has_more(self) -> bool:"""是否还有牌"""return self.counter < len(self.cards)def main():poker = Poker()poker.shuffle()while poker.has_more():print(poker.deal(), end=' ')if __name__ == '__main__':main()

玩家类

"""
example08 - 玩家
Author: yucui
Date: 2021/8/5
"""
from example07 import Pokerclass Player:"""玩家"""def __init__(self, nickname):self.nickname = nicknameself.cards = []def get_one_card(self, card):"""摸一张牌"""self.cards.append(card)def arrange(self):"""整理手上的牌"""self.cards.sort()def show(self):"""显示玩家手上的牌"""print(self.nickname, end=': ')for card in self.cards:print(card, end=' ')print()def main():nicknames = ('东邪', '西毒', '南帝', '北丐')players = [Player(nickname) for nickname in nicknames]poker = Poker()poker.shuffle()# 将牌发到四个玩家的手上for _ in range(13):for player in players:card = poker.deal()player.get_one_card(card)# 显示四个玩家手上的牌for player in players:player.arrange()player.show()if __name__ == '__main__':main()

Python学习笔记:16 面向对象编程入门相关推荐

  1. 学习笔记----MATLAB面向对象编程入门02--类的方法、构造函数

    本系列内容为<MATLAB面向对象编程–从入门到设计模式>学习笔记,特此说明. 定义类的方法 类的方法(Method)一般用来查询(Query)对象的状态,或者向对象发出一个命令(Comm ...

  2. Python学习笔记:面向对象编程(4)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记:面向对象编程(3)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Python学习笔记:面向对象编程(2)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:面向对象编程(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. python学习笔记(七):面向对象编程、类

    一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...

  7. 【python学习笔记】面向对象编程

    面向对象编程 对象(object):表示客观世界问题空间中的某个具体事物,又表示软件系统解空间的中的基本元素 面向对象程序设计(Object-oriented programing, OP):是一种程 ...

  8. 【廖雪峰Python学习笔记】面向对象编程OOP

    面向对象编程 OOP:Object Oriented Programming 程序的基本单元:对象 [ = 数据 + 操作数据的函数] [属性 + 方法] 三大特点:数据封装.继承和多态 OPP中的计 ...

  9. python学习笔记Day4 面向对象编程,文件操作,os模块,代码调试

    一.traceback模块 错误日志可能用到 import tracebackwhile 1: # 捕获异常的顺序按照先父类后子类try:n1 = int(input('请输入一个被除数'))n2 = ...

  10. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

最新文章

  1. (转)利用ArcScene进行三维地形模拟
  2. HP QC IE11不支持( win7 64位 无法安装)解决方法
  3. 信息系统项目管理师-第二三章:信息系统项目管理基础与立项管理3
  4. ----uni-app之用canvas同时画多张海报实现分享----
  5. 打印Java数组最优雅的方式
  6. Python简单实现基于VSM的余弦相似度计算
  7. arp 命令最简单的小应用
  8. mockito 使用_用Mockito回答
  9. java webservice 客户端_Java Webservice客户端(最佳方法)
  10. 配色没有灵感?最流行的配色案例!没有一个人不爱的
  11. “21天好习惯”第一期-12
  12. android 摄像头检测工具,检摄app2.0.2最新版(摄像头检测)
  13. 车载双目摄像头,为什么特斯拉还在迟疑?
  14. 基于Multism的高频小信号谐振放大器仿真研究
  15. TeamViewer远程访问打开软件黑屏
  16. deepin系统引导_Deepin系统安装教程
  17. C#调用Onnx模型
  18. Python内置函数及其用法
  19. js实现文本相似度对比
  20. 【硬见小百科】三极管开关原理与场效应管开关原理

热门文章

  1. eWebeditor集成aspjpeg
  2. mysql -- 基本操作
  3. MD5加密js-md5
  4. 谈谈Spring中的IOC、DI和AOP概念
  5. 教你查询快递单号物流,并筛选已签收还有的物流单号
  6. java.sql.SQLRecoverableException: IO 错误: Undefined Error错误解决办法
  7. java逻辑共享设计_精美图文讲解Java AQS 共享式获取同步状态以及Semaphore的应用...
  8. Android手机静态ip地址网关,安卓手机Android 4.0系统静态ip设置方法【详解】
  9. 《你好,放大器》----学习记录(六)
  10. Deep Stable Learning for Out-Of-Distribution Generalization