隐式基类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. python下载站长素材免费简历模板(xpath)

    import os.path import requests from lxml import etree if __name__ == '__main__': if not os.path.exis ...

  2. vxWidgets(一):初识

    wxWidgets 和 QT 之间的选择 跨平台的C++ GUI工具库很多,可是应用广泛的也就那么几个,Qt.wxWidgets便是其中的翘楚这里把GTK+排除在外,以C实现面向对象,上手相当困难,而 ...

  3. 课程表及事件提醒app-界面原型设计

    前端设计: 暂定为8个主要界面:程序初始界面.主界面(首页).课表界面."我的"界面.登录界面.注册界面.创建事件界面.新建课表界面 设计思路: 项目结构 三个主要界面 首页: 课 ...

  4. vue重置data数据为初始状态

    vue中: this.$data 获取当前状态下的data this.$options.data() 获取该组件初始状态下的data 所以,下面就可以将初始状态的data复制到当前状态的data,实现 ...

  5. csdn 复制

    $("#content_views pre").css("user-select","text"); $("#content_vi ...

  6. 继承方式创建线程(继承Thread类)

    步骤: 用类继承Thread类 重写run()方法 在测试类中创建Thread的子类对象 通过此对象调用Start //1.类继承Thread public class AAA extends Thr ...

  7. git多分支-git远程仓库-ssh方式连接远程仓库-协同开发-冲突解决-线上分支合并-远程仓库回滚

    目录 git多分支-git远程仓库-ssh方式连接远程仓库-协同开发-冲突解决-线上分支合并-远程仓库回滚 昨日内容回顾 今日内容概要 今日内容详细 1 git多分支 2 git远程仓库 3 ssh方 ...

  8. 关于WPF的圆角

    失败案例 <Border CornerRadius="3" Width="100" Height="100"> <Stac ...

  9. flask框架的使用

    在学习了DJango后,又学习FLASK框架,刚入手的感觉就是好简单啊,简单的7行代码,就能搭建一个简单的WEB服务器. from flask import Flask app = Flask(__n ...

  10. Java-Collectors.groupingBy

    Java中的Collectors类的groupingBy()方法用于按某些属性对对象进行分组并将结果存储在Map实例中. 当我我们想利用它的特性,我们需要指定一个属性来执行分组.此方法提供的函数类似于 ...