Python面向对象编程——__init()__方法
隐式基类object
每个python类都隐式继承object
全文代码实例实现:枚举扑克牌的花色和牌面值
一、_init()__方法:对象初始化
显示而非隐式:__init()__应显示展示初始化变量
对象被实例化时,先创建一个空对象,然后再调用__init()__对对象内部变量或其他内容进行初始化
二、_init()__方法用例:
(一)基类实现初始化
1 class Card:
2 def __init__(self, rank, suit):
3 self.rank = rank
4 self.suit = suit
5 self.hard, self.soft = self._points()
6
7
8 class NumberCard(Card):
9 def _points(self):
10 return int(self.rank), int(self.rank)
11
12
13 class AceCard(Card):
14 def _points(self):
15 return 1, 11
16
17
18 class FaceCard(Card):
19 def _points(self):
20 return 10, 10
- 三个子类共享公共初始化逻辑
- 多态:三个子类对_points(self)都有不同的功能实现
改进:子类实现__init()__方法
1 class Card:
2 def __init__(self, rank, suit, hard, soft):
3 self.rank = rank
4 self.suit = suit
5 self.hard = hard
6 self.soft = soft
7
8
9 class NumberCard(Card):
10 def __init__(self, rank, suit):
11 super().__init__(str(rank), suit, rank, rank)
12
13
14 class AceCard(Card):
15 def __init__(self, rank, suit):
16 super().__init__('A', suit, 1, 11)
17
18
19 class FaceCard(Card):
20 def __init__(self, rank, suit):
21 super().__init__({1: 'A', 11: 'J', 12: 'Q', 13: 'K'}[rank], suit, 10, 10)
super():用于子类要调用父类的同名方法时
单继承:
直接在同名函数中调用super().fun_name()
多继承:
直接在同名函数中调用super(要调用某父类的前一个类名, self).fun_name()
(二)创建常量清单
# 牌的字符与名称
class Suit:
def __init__(self, name, symbol):
self.name = name
self.symbol = symbol
1 Club, Diamond, Heart, Spade = Suit('Club', 'C'), Suit('Diamond', 'D'),\
2 Suit('Heart', 'H'), Suit('Spade', 'S')
调用
二、工厂函数
实现工厂函数的两种途径
- 定义一个函数,返回不同类的对象
- 定义一个类,包含创建对象的方法
途径一:
1 def card1(rank, suit):
2 if rank == 1:
3 return AceCard('A', suit)
4 elif 2 <= rank <= 10:
5 return NumberCard(str(rank), suit)
6 elif rank == 11:
7 return FaceCard('J', suit)
8 elif rank == 12:
9 return FaceCard('Q', suit)
10 elif rank == 13:
11 return FaceCard('K', suit)
上述函数实现了牌面值与花色的对应
三、使用映射和类来简化设计
(一)并行映射
1 def card2(rank, suit):
2 # 在集合中查找rank, 未查到到返回NumberCard
3 class_ = {1: AceCard, 11: FaceCard, 12: FaceCard, 13: FaceCard}.get(rank,
4 NumberCard)
5 rank_str = {1: 'A', 11: 'J', 12: 'Q', 13: 'K'}.get(rank, str(rank))
6 return class_(rank_str, suit)
缺点:映射键1、11、12、13逻辑重复,使用两次映射来获取牌面值和花色。重复的代码是多余的,提高了维护成本
(二)二元组映射
1 # 二元组映射
2 def card3(rank, suit):
3 class_, rank_str = {1: (AceCard, 'A'), 11: (FaceCard, 'J'), 12: (FaceCard, 'Q'),
4 13: (FaceCard, 'K')}.get(rank, (NumberCard, str(rank)))
5 return class_(rank_str, suit)
(三)partial函数:偏函数
使用方法:调用函数fun_name(arg1,arg*.....)
fun_name1=partial(fun_name, arg1…)
fun_name1(arg*…) 偏函数
from functools import partial
def card4(rank, suit):
part_class = {1: partial(AceCard, 'A'), 11: partial(FaceCard, 'J'),
12: partial(FaceCard, 'Q'), 13: partial(FaceCard, 'K')}\
.get(rank, partial(NumberCard, str(rank)))
return part_class(suit)
(四)工厂流畅API
结合二元组映射实现API,该对象顺序调用
1 class CardFactory:
2 def rank(self, rank):
3 self.class_, self.rank_str = {
4 1: (AceCard, 'A'),
5 11: (FaceCard, 'J'),
6 12: (FaceCard, 'Q'),
7 13: (FaceCard, 'K')
8 }.get(rank, (NumberCard, str(rank)))
9 return self
10
11 def suit(self, suit):
12 return self.class_(self.rank_str, suit)
Python面向对象编程——__init()__方法的更多相关文章
- python -- 面向对象编程(属性、方法)
一.属性 对象的属性(attribute)也叫做数据成员(data member). 如果想指向某个对象的属性,可以使用格式: object.attribute 属性又分为:私有属性和公有属性. 私有 ...
- Python - 面向对象编程 - __new()__ 和单例模式
单例模式 这是一种设计模式 设计模式是前任工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性 单 ...
- Python - 面向对象编程 - __del__() 析构方法
del 语句 Python 提供了 del 语句用于删除不再使用的变量 语法 del 表达式 删除变量的栗子 var = "hello" del var print(var) # ...
- python 面向对象编程 之 析构方法
析构方法:当对象在内存中被释放的时候,自动触发执行 如果产生的对象仅仅只是用户级别的, 那么无需定义__del__,如果对象还会向操作系统发生系统调用, 即一个对象有用户级别与内核级两种资源, 比如打 ...
- Python——面向对象编程
面向对象编程是一种程序设计思想,把对象作为程序的基本单元,一个对象里面包含了数据以及操作数据的方法,称为类的属性和方法. 基础-定义.实例化.实例属性 用class来定义对象,类名首字母大写,如果这个 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
随机推荐
- tesseract-ocr 安装、语言库、使用 随记
前几日才听说ocr的图片识别功能.觉得很有意思.先体验一下. 地址: GitHub - tesseract-ocr/tesseract: Tesseract Open Source OCR Engin ...
- idea启动项目,报java.lang.OutOfMemoryError: PermGen space 和启动项目很慢的问题解决
启动一个老的项目,报错,查是内存溢出 进入 VM options 加上 -Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m 在 ...
- Maven简答题
1.什么是Maven? 自动化构建工具,专注服务于Java平台的项目构建和依赖管理 2.使用Maven的好处以及原因? (1)大量的jar包反复复制,造成冗余.使用Maven后每个jar包只在本地仓库 ...
- (0319) uvmgen的使用,产生的UVM环境介绍
qq https://blog.csdn.net/hh199203/article/details/118210541
- python图片转base64、base64转图片
#图片转base64 import base64 with open("./1.png","rb") as f:#转为二进制格式 base64_data = b ...
- centos7.8 安装 redis5.0.2
1.安装gcc依赖 redis是由C语言开发,因此安装之前必须要确保服务器已经安装了gcc,可以通过如下命令查看机器是否安装: gcc -v 如果没有安装则通过以下命令安装: yum install ...
- 各种工具点评以供选择使用 + 开发工具秘籍(git, webpack。。。。)
git最佳实践: https://gist.github.com/fandean/ca29cd2f326f66c659951d7ab356cefb ========================== ...
- Vue案例——todolist
最近在学习vue,实现todolist案例,实现效果如下: 该案例分为四个部分:header为输入框,body为列表,item是列表中的条目,footer为最下方的统计. 实现步骤: ①创建项目 vu ...
- 使用MVC编程模型通过flask蓝图实现前端后台新闻发布系统
相关知识点: flask:是Python开发轻量级框架,也能很好的开发动态网站. 蓝图:flask中蓝图能很好的实现代码分割管理,从而不使代码全部放在app.py杂乱无章,蓝图就像动物管理员一样,把猫 ...
- C++ primer 5th 第一章 开始 阅读笔记
第一章 开始 第一节 编写一个简单的C++程序 不同编译器使用不同的后缀命名约定,比如cc.cpp.c. 比如main程序保存到prog1.cc中,可以使用如下命令来编译它:cc prog1.cc.其 ...