隐式基类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. HJ77 火车进站

    描述 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先 ...

  2. 南大ics-pa/PA0过程及感想

    实验教程地址:https://nju-projectn.github.io/ics-pa-gitbook/ics2022/index.html 一.Ubuntu安装 在清华大学镜像站下载了Ubuntu ...

  3. vue ref用法

    <div class="myClass" ref="diva"></div> // 给dom节点添加ref this.$refs.div ...

  4. nodeJs 写个爬虫小玩意

    内容 起一个服务,爬某个网站的数据(我这里爬了个夕阳红游戏交易网站的数据),页面看到我要爬的内容 代码 1 //引入内置的http包 2 var http = require('http'); 3 c ...

  5. 关于webpack 开启代理proxy后,接口看不到代理地址的问题。

    今天在项目中发现, 明明在proxy里代理了 接口地址确不是10.10.11.106/front/xxxxxx.这是为啥呢?changeOrigin的修改也是一样,在网络请求中发现host还是没改.这 ...

  6. axios响应拦截器无法显示响应头问题

    Access-Control-Expose-Headers 响应报头.跨域 公开响应头 问题现象: 前端无法获取响应头 Response Header 原因 问题原因:跨域问题 启用跨域请求(CORS ...

  7. 你的ASP.NET Pages项目编译时为何总是很慢慢慢~?

    摘要 很多同学在运行同一个Asp.net Pages项目解决方案时会发现,有时候很快,有时候超级慢,甚至时间超过10几分钟才可以完全编译完,随后才能调试! 其实这都是跟配置有关 有句话说的话,约定  ...

  8. 安装zookeeper 和 kafka

    本文用到的同步脚本   https://www.cnblogs.com/sdgtxuyong/p/16907986.html 一 . 安装zookeeper 修改hosts文件,将test1,test ...

  9. Maven3.6.1 (转载大佬文章)

    (30条消息) Maven3.6.1安装及配置_浅若清风过的博客-CSDN博客 1.下载https://archive.apache.org/dist/maven/maven-3/3.6.1/bina ...

  10. (K8s学习笔记六)Pod的调度

    RC(ReplicationController)只能选择一个标签,RS(ReplicaSet)可选择多个标签,例如APPTest发布了v1和v2两个版本,并希望副本数为3,可同时包含v1和v2两个版 ...