隐式基类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()__方法的更多相关文章

  1. python -- 面向对象编程(属性、方法)

    一.属性 对象的属性(attribute)也叫做数据成员(data member). 如果想指向某个对象的属性,可以使用格式: object.attribute 属性又分为:私有属性和公有属性. 私有 ...

  2. Python - 面向对象编程 - __new()__ 和单例模式 

    单例模式 这是一种设计模式 设计模式是前任工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性 单 ...

  3. Python - 面向对象编程 - __del__() 析构方法

    del 语句 Python 提供了 del 语句用于删除不再使用的变量 语法 del 表达式 删除变量的栗子 var = "hello" del var print(var) # ...

  4. python 面向对象编程 之 析构方法

    析构方法:当对象在内存中被释放的时候,自动触发执行 如果产生的对象仅仅只是用户级别的, 那么无需定义__del__,如果对象还会向操作系统发生系统调用, 即一个对象有用户级别与内核级两种资源, 比如打 ...

  5. Python——面向对象编程

    面向对象编程是一种程序设计思想,把对象作为程序的基本单元,一个对象里面包含了数据以及操作数据的方法,称为类的属性和方法. 基础-定义.实例化.实例属性 用class来定义对象,类名首字母大写,如果这个 ...

  6. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  7. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  8. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  9. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  10. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

随机推荐

  1. requests学习笔记01

    一.发送请示 # 导入 Requests 模块 import requests # 获取某个网页 r = requests.get("http://www.baidu.com") ...

  2. react native 中 fetch获取请求头header 的token信息

    首先说一句,所有请求,都要带一个token信息,很难受啊,我目前直接将token信息放在global下自定的属性里面.(本地存储Storage和AsyncStorage,取一下,好麻烦) global ...

  3. KETTLE 首次连DB2报错,无驱动。

    DB2 把相应数据库的jar包放入 data-integration\lib 或者data-integration\libswt\win64 重启kettle程序 连接成功 驱动包,我是用的aqua工 ...

  4. 最近录了一些python视频教程

    最近录了一些python视频教程,目前有机器学习的.python基础知识的,大家可以去B站观看. https://space.bilibili.com/431152063 python机器学习之KNN ...

  5. flutter 图片加载缓存以及圆角的实现

    使用最多的图片缓存组建库cached_network_image 地址:cached_network_image 配置: dependencies: cached_network_image: ^2. ...

  6. 《《《PLSQL Developer编辑器怎么设置圆括号高亮

    转载:PLSQL Developer编辑器怎么设置圆括号高亮-百度经验 (baidu.com) 为了在plsql中调代码好调 LSQL Developer编辑器怎么设置圆括号高亮?有时候对PLSQL ...

  7. 关于window的文件路径

    跟大家分享一下,初学者的坑.事情是这样的,windows下读取文件路径失败,以下是简单python代码: 点击查看代码 with open("F:\python_file_data\pyth ...

  8. 安防视频监控系统前端摄像机——DSP与SOC摄像机

    一.DSP摄像机 DSP(Digital Signal Processing)即数字信号处理,它是利用数字计算机或专用数字信号处理设备,以数值计算的方法对信号进行采集.变换.综合.估值.识别等加工处理 ...

  9. js引入样式资源报错

    如上图,import这几个样式资源为什么会报错,怎么解决呢,而且那个jquery-ui之前也会报错但是现在刷新一遍他又不报错了其他的css文件报错 图片转代码服务由CSDN问答提供 功能建议   im ...

  10. 前端导出文件流[object Object]

    情景:后台返回文件流,前端导出. 参照网上的文章配置responseType:'blob' :blob导出文件乱码_前端小菜鸟__简单的博客-CSDN博客_blob导出乱码 后台管理项目blob导出文 ...