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

python学习 专栏收录该内容
13 篇文章 0 订阅

以下类的代码来自: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 = customer
        self._bank = bank
        self._account = acnt
        self._limit = limit
        self._balance = 0  ###在这里给初始消费金额默认设为0

    def get_customer(self):
        """返回持卡人姓名."""
        ### 这是信用卡类的一个方法
        return self._customer
    
    def get_bank(self):
        """返回银行名称."""
        return self._bank

    def get_account(self):
        """返回账号."""
        return self._account

    def get_limit(self):
        """返回信用卡限额."""
        return self._limit

    def get_balance(self):
        """返回消费金额."""
        return self._balance

    def charge(self, price):
        """信用卡扣款,用信用卡消费的钱数是price,且需要在信用卡的限额以内.

        如果没有超限额,返回True代表扣款成功,如果超限额返回False代表扣款失败.
        """
        if price + self._balance > self._limit:  # 如果新扣的钱加上已有的消费金额已经超过了限额,
          return False                           # 那么扣款失败
        else:
          self._balance += price
          return True

    def 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 = apr

    def 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%!原来大玩家是一个地下高利贷组织。
### 大侠夏侯商元无力偿还这笔债务,只能离开通州,走清河、沙河、昌平县、南口、青龙桥……勇闯天涯去了。
  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值