一、写在前面✨
大家好!我是初心,希望我们一路走来能坚守初心!
今天跟大家分享的文章是 Python中的继承与多态
,希望能帮助到大家!本篇文章收录于 初心 的 Python从入门到精通 专栏。
🏠 个人主页:初心%个人主页
🧑 个人简介:大家好,我是初心,和大家共同努力
💕欢迎大家:这里是CSDN,我记录知识的地方,喜欢的话请三连,有问题请私信😘
💕 山重水复疑无路,柳暗花明又一村。 —— 陆游「游山西村」
二、继承
继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。继承的特点就是子类可以使用父类的属性(特征、技能)。
继承是类与类之间的关系。
继承可以减少代码冗余、提高重用性。
语法:
Class 派生类名(基类名):
例如创建student类,继承people类的代码。
class student(people):
三、多态
多态性依赖于继承。从一个父类派生出多个子类,可以使子类之间有不同的行为,这种行为称之为多态。更直白的说,就是子类重写父类的方法,使子类具有不同的方法实现。
子类与父类拥有同一个方法,子类的方法优先级高于父类,即子类覆盖父类。只要方法存在,参数正确,就可以调用。
如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法重写了父类的方法。
方法重写在不同类,是实现多态的必要条件。
四、Account和FreeChecking类的实现
编程要求:补全Account和FreeChecking类的实现。
class Account: """An account has a balance and a holder. >>> a = Account('John') >>> a.deposit(12) 12 >>> a.balance 12 >>> a.interest 0.02 >>> a.time_to_retire(20) 26 >>> a.balance # balance 保持不变 12 >>> a.withdraw(11) # 每次取款额度不超过10,超过无法取出 "Can't withdraw that amount" >>> a.withdraw(10) 2 >>> a.withdraw(10) 'Insufficient funds' """ def __init__(self, account_holder): self.balance = 0 self.holder = account_holder def deposit(self, amount): self.balance = self.balance + amount return self.balance def withdraw(self, amount): def time_to_retire(self, amount): """Return the number of years until balance would grow to amount.""" assert self.balance > 0 and amount > 0 and self.interest > 0 class FreeChecking(Account): """A bank account that charges for withdrawals, but the first two are free! >>> ch = FreeChecking('Jack') >>> ch.balance = 20 >>> ch.withdraw(100) # 首次取款免费,不论是否成功,免费次数减少1次 'Insufficient funds' >>> ch.withdraw(3) # 第二次取款免费 17 >>> ch.balance 17 >>> ch.withdraw(3) # 2次免费用完,开始收费 13 >>> ch.withdraw(3) 9 >>> ch2 = FreeChecking('John') >>> ch2.balance = 10 >>> ch2.withdraw(3) # 首次免费 7 >>> ch.withdraw(3) # 2次免费 5 >>> ch.withdraw(5) # 余额不足 'Insufficient funds' """ def __init__(self, account_holder): def withdraw(self, amount): import doctest doctest.testmod()
具体实现:
class Account: # 此处已经略去case # 利率 interest = 0.02 # 最大取款额度 max_amount = 10 def __init__(self, account_holder): self.balance = 0 self.holder = account_holder self.interest = Account.interest def deposit(self, amount): self.balance = self.balance + amount return self.balance def withdraw(self, amount): # 取款超过最大取款额度,不让取款 if (amount > Account.max_amount): return "Can't withdraw that amount" # 余额不足,不让取款 if (self.balance < amount): return 'Insufficient funds' self.balance -= amount return self.balance def time_to_retire(self, amount): """Return the number of years until balance would grow to amount.""" assert self.balance > 0 and amount > 0 and self.interest > 0 # 账户余额 = 本金+本金*(1+利息) amounts = self.balance years = 0 while True: amounts += amounts * self.interest years += 1 if (amounts >= amount): return years class FreeChecking(Account): # 此处已经略去case # 初始账户余额 init_balance = 20 # 免费取款次数 free_draw_times = 2 # 取款手续费 draw_fee = 1 def __init__(self, account_holder): self.balance = FreeChecking.init_balance self.holder = account_holder def withdraw(self, amount): # 如果账户余额小于取款额度,不能取款,次数减一 if (self.balance < amount): self.free_draw_times -= 1 return 'Insufficient funds' # 如果免费次数大于0小于3,免费取款 if (self.free_draw_times > 0 and self.free_draw_times < 3): self.balance -= amount # 否则收费取款 else: # 如果存款比手续费加取款额度少,不让取款 if (self.balance - (amount + FreeChecking.draw_fee) < 0): return 'Insufficient funds' # 可以取款 self.balance -= (amount + FreeChecking.draw_fee) # 免费次数减一 self.free_draw_times -= 1 return self.balance import doctest doctest.testmod()
五、总结撒花😊
本文主要讲解了Python中的继承和多态的基本使用。😊
✨ 这就是今天要分享给大家的全部内容了,我们下期再见!😊
🏠 本文由初心原创,首发于CSDN博客, 博客主页:初心%🏠
🏠 我在CSDN等你哦!😍