以下类的代码来自:Data structures and algorithms in python第二章

实例: 信用卡

CreditCard:

  • 识别信息 - Customer, Bank, Account Number, Credit Limit and Current Balance
class CreditCard:"""一个消费信用卡类."""### init算作类的构造器,用来执行实例的初始化:def __init__(self, customer, bank, acnt, limit):"""使用init创建一个新实例.初始的默认消费金额为0.customer  持卡人姓名 (e.g., 'John Bowman')bank      银行名称 (e.g., '中国人民很行')acnt      账号 (e.g., '5391 0375 9387 5309')limit     信用额度"""self._customer = customerself._bank = bankself._account = acntself._limit = limitself._balance = 0  ###在这里给初始消费金额默认设为0def get_customer(self):"""返回持卡人姓名."""### 这是信用卡类的一个方法return self._customerdef get_bank(self):"""返回银行名称."""return self._bankdef get_account(self):"""返回账号."""return self._accountdef get_limit(self):"""返回信用卡限额."""return self._limitdef get_balance(self):"""返回消费金额."""return self._balancedef charge(self, price):"""信用卡扣款,用信用卡消费的钱数是price,且需要在信用卡的限额以内.如果没有超限额,返回True代表扣款成功,如果超限额返回False代表扣款失败."""if price + self._balance > self._limit:  # 如果新扣的钱加上已有的消费金额已经超过了限额,return False                           # 那么扣款失败else:self._balance += pricereturn Truedef make_payment(self, amount):"""信用卡还款,从消费金额中减去amount这么多的钱."""self._balance -= amount
wallet = []  ### 创建一个名为wallet的空列表,表示一个空空如也的钱包;### 在以下操作中,CreditCard('XXX', 'XXX','XXX', XXX)表示创建了CreditCard这个类的一个实例,并对这个实例的几个属性进行了赋值,
### 按照构造CreditCard类时的顺序,这几个属性分别代表持卡人姓名、银行名称、账号、信用额度
### 注意,有的值带有引号,表示给这个属性赋值的是字符串的类型,不加引号,表示赋值的是一个数字。
### 接下来,wallet.append()表示使用了列表的内置函数append,把生成的一个信用卡实例放入wallet列表:
wallet.append(CreditCard('夏侯商元', '中国人民很行','5391 0375 9387 5309', 2500) )  # 大侠夏侯商元往钱包中放入了一张中国人民很行的信用卡
wallet.append(CreditCard('夏侯商元', '北京大兴区农业信用合作社','3485 0399 3395 1954', 3500) )  # 大侠夏侯商元往钱包中放入了一张北京大兴区农业信用合作社的信用卡
wallet.append(CreditCard('夏侯商元', '北京通州区万达广场大玩家','27149', 300) )                 # 大侠夏侯商元往钱包中放入了一张北京通州区万达广场大玩家的信用卡
### 由于wallet是一个列表类型,那么可以通过序号来访问列表中的元素,即:wallet[x],wallet中每一个元素的类型都是CreditCard
### 接着用CreditCard类中的charge方法给每个信用卡实例扣款,本质是修改各个实例中balance属性的值。for val in range(1, 17):### 进行val的值依次为1-16的16轮循环(注:python中的range默认包括起始值不包括终止值)### 在每轮循环中给三张卡扣除val、2×val、3×val的钱数:wallet[0].charge(val)wallet[1].charge(2*val)wallet[2].charge(3*val)
for c in range(3):print('Customer =', wallet[c].get_customer())print('Bank =', wallet[c].get_bank())print('Account =', wallet[c].get_account())print('Limit =', wallet[c].get_limit())print('Balance =', wallet[c].get_balance())while wallet[c].get_balance() > 100:### 如果卡内的已消费金额大于100,则进行一次100的还款:wallet[c].make_payment(100)print('New balance =', wallet[c].get_balance())print("\n")

Customer = 夏侯商元
Bank = 中国人民很行
Account = 5391 0375 9387 5309
Limit = 2500
Balance = 136
New balance = 36

Customer = 夏侯商元
Bank = 北京大兴区农业信用合作社
Account = 3485 0399 3395 1954
Limit = 3500
Balance = 272
New balance = 172
New balance = 72

Customer = 夏侯商元
Bank = 北京通州区万达广场大玩家
Account = 27149
Limit = 300
Balance = 273
New balance = 173
New balance = 73

### 下面展示类的继承的概念:class PredatoryCreditCard(CreditCard):"""创建一个掠夺性信用卡的新类,继承自CreditCard的已有类,增加了interest利率 和 fees手续费."""def __init__(self, customer, bank, acnt, limit, apr):"""使用init创建一个新实例.初始的默认消费金额为0.customer  持卡人姓名 (e.g., 'John Bowman')bank      银行名称 (e.g., '中国人民很行')acnt      账号 (e.g., '5391 0375 9387 5309')limit     信用额度apr       年利率 (e.g., 0.0825 for 8.25% APR)"""### 关于super的简要说明,由于父类CreditCard有__init__方法,子类PredatoryCreditCard也有__init__方法,### 如果不做特殊处理,子类的__init__就覆盖了父类的同名方法,不能继承父类__init__中的内容了,### 因此使用super()函数来表示父类,即以下先在子类的__init__中调用了父类的__init__:
#         super().__init__(customer, bank, acnt, limit)  # 调用父类中的__init__super(PredatoryCreditCard, self).__init__(customer, bank, acnt, limit)  # 也可以这样写### 再完善子类自己的__init__,增加一个新的属性年利率:self._apr = aprdef charge(self, price):"""信用卡扣款,用信用卡消费的钱数是price,且需要在信用卡的限额以内.如果扣款成功返回True.如果扣款不成功返回False,且要扣除5块钱的手续费."""### 与上面的__init__类似,子类要先通过super()调用父类的charge():
#         success = super().charge(price)          # 调用父类中的方法success = super(PredatoryCreditCard, self).charge(price)          # 调用父类中的方法if not success:self._balance += 5                     # 如果扣款没有成功,那么要扣除5块钱的手续费return success                           def process_month(self):"""如果每月有没还上的扣款,那么要对没还上的部分征收利息."""if self._balance > 0:# 如果有没还上的钱, 先把年利率转化为月利率:monthly_factor = pow(1 + self._apr, 1/12)# 再用月利率乘以扣款:self._balance *= monthly_factor
### 建立一个新的类的实例:DaWanJia就代表了这个实例DaWanJia = PredatoryCreditCard('夏侯商元','北京通州区万达广场大玩家','27149', 300, 50)
DaWanJia.get_balance()  ### 此方法返回消费金额

0

DaWanJia.charge(300)  ### 夏侯商元在万达大玩家消费了300元

True

for month in range(0,6):DaWanJia.process_month()  ### 这笔钱夏侯商元半年也没去还
DaWanJia.get_balance() ### 利滚利夏侯商元现在欠大玩家这么多钱:

2142.4285285628553

### 直到此时夏侯商元才发现,办卡的时候,大玩家信用卡的年利率竟然达到了5000%!原来大玩家是一个地下高利贷组织。
### 大侠夏侯商元无力偿还这笔债务,只能离开通州,走清河、沙河、昌平县、南口、青龙桥……勇闯天涯去了。

从一个“信用卡”类理解python面向对象编程的核心概念相关推荐

  1. python的核心理念是什么_Python 面向对象编程的核心概念知识点简介

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于 无量测试之道 ,作者: 无量测试之道 刚接触Python的新手.小白,可以复制下面 ...

  2. 如何理解Python 面向对象编程思想

    Python 面向对象编程思想 1. 宽泛的面向对象的概念 举例说明 面向过程:做一件事情,从头到尾,每一个细节都要关注,重点在于过程 面向对象:做一件事情,用对象去做,不关心细节和过程,万物皆对象 ...

  3. python做gui好吗_使用Python制作一个铅笔类(Python GUI编程)

    今天,带领大家制作一个铅笔类,实现在界面内自由画图的功能,类似一个铅笔在画布上绘图.通过这个课题,我们可以学习以下内容: Canvas自由绘图的基本思路鼠标事件绑定基本用法如何改变鼠标形状不赘述,先上 ...

  4. 十四、理解nn.module方法——学习python面向对象编程(一)

    起因 在(十二)中说到pytorch中创建神经网络的两种方法:一个是Sequential类(这也是一种继承父类属性和方法并可对其方法重构的子类),另一个是自己编写代码,继承nn.module类,对其内 ...

  5. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  6. python面向对象编程中方法和属性_Python面向对象编程中关于类和方法的学习笔记...

    Python面向对象编程中关于类和方法的学习笔记 类与类方法是面向对象的编程语言中必不可少的特性,本文总结了Python面向对象编程中关于类和方法的学习笔记,需要的朋友可以参考下 类和实例 pytho ...

  7. python面向对象编程中_Python面向对象编程中关于类和方法

    类和实例 python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句"物以类聚". 没错就是类, 归类 物以类聚 类 ...

  8. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  9. python面向对象编程的三大特性_Python面向对象总结及类与正则表达式详解

    Python3 面向对象 -------------------------------------------------------------------------------- 一丶面向对象 ...

最新文章

  1. 《SQL Server 管理与维护指南》章节目录
  2. mysql如何存储表情,如何让mysql支持存储表情
  3. 【mybatis】在mybatis分页查询时,主表对关联表 一对多 分页查询怎么实现
  4. linux c printf 不能输出
  5. 408. Valid Word Abbreviation有效的单词缩写
  6. 2020年度总结(只有做好自己不喜欢的事情你才能做自己喜欢的事情)
  7. boost::timer::progress_display相关的测试程序
  8. 如何证明服从卡方分布_谈谈抽样分布定理
  9. ASP.NET Core2.0 环境下MVC模式的支付宝PC网站支付接口-沙箱环境开发测试
  10. 2018年阿里云NoSQL数据库大事盘点
  11. 关于meta http-equiv=Content-Type content=text/html:charset=UTF-8
  12. python socket客户端_python 使用socket模拟tcp客户端和tcp服务器端
  13. 【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
  14. Android蓝牙完全学习手册
  15. oracle 临时表空间的作用和创建以及相关操作
  16. 【uni-app系列】uni-ui扩展组件和uViewUI的安装使用
  17. 如何使用内网穿透,将自己的内网接口暴露到外网
  18. 批量手机号码状态检测【已失效】
  19. php版本大屏幕,PHP现场抽奖大屏幕互动系统
  20. NeRF神经辐射场学习笔记(十)— BungeeNeRF(CityNeRF)实现以及代码注释

热门文章

  1. Sqlmap 22.05.22.02
  2. 【人工智能 AI】机器学习快速入门教程(Google)
  3. Allegro贴片元件封装制作
  4. 沈从文《边城》中的“碾坊”与“渡船”、“车路”与“马路”
  5. concatenation 和 element-wise summation 该选哪个?
  6. 厂房消防宣传设置要求和注意事项
  7. 手把手带你玩转需求预测-需求预测方法介绍
  8. 2018年7月24日日报
  9. 大三,请问现在自学Java还来得及吗?
  10. Linux 内核树编译