一、什么是继承

1、继承

即允许基于一个现有的类作为起点定义新的类的一种技术

2、父类与子类

在面向对象的术语中,通常描述现有的类为基类(bass class)、父类(parent class)、或者超类(superclass)
基于现有类新定义的类为子类(subclass或childclass)

二、继承的方法

  • 重写
    子类提供一个覆盖现有方法的 新的实现方法,特化一个现有的行为
  • 扩展
    子类提供一些全新的方法扩展父类

下面以课程2.1中CreditCard类为父类,实现一个可以评估利息和费用的PredatoryCreditCard子类为例,说明重写和扩展的举例实现。

CreditCrad父类

class CreditCard:
	def __init__(self,customer,bank,acnt,limit): 
		self._customer = customer				#用户名,例如:'zhang san'
		self._bank = bank						#所属银行,例如:'招商银行’'
		self._account = acnt					#卡账号,例如:6222023200003451627
		self._limit = limit						#卡额度,例如:18000
		self._balance = 0						#已用额度,例如:8500
		
	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):
		if price + self._balance > self._limit:
			return False
		else:
			sele._balance += price
			return True

	def make_payment(self,amount):
		self._balance -= amount

PredatoryCreditCrad子类

class PredatoryCreditCrad(CreditCard):
'''由CreditCard类扩展的新类,提供了三个成员函数:__init__、charge和process_month
这些函数的主体,都依赖调用继承的构造函数来执行大部分初始化处理'''

	def __init__(self,customer,bank,acnt,limit,apr):
		'''调用继承构造函数的机制依赖于super()语法,调用父类中相对应的方法'''
		super().__init__(customer,bank,acnt,limit)		#调用从CreditCard父类继承的__init__方法
		self._apr = apr		#年利息
		
	def charge(self,price):
		'''重写了继承的charge方法:
		当尝试收费,但由于信用卡额度不足而被拒绝时,收取5美元的费用'''
		success = super().charge(price)			#调用从CreditCard父类继承的charge方法
		if not success:
			self._balance += 5
		return success		#返回继承的charge方法的值给调用者,这样可使新的收费方法与原来的有类似的外部接口

	def process_month(self):
		'''拓展了一个新的process_month方法:
		当有一个未清余额时,按月收取利息'''
		if self._balance > 0:
			monthly_factor = pow(1 + self._apr,1/12)
			self._balance *= monthly_factor

三、一些其他概念

1、保护成员

一些面向对象的语言,允许声明的受保护私有的访问模式

  • 受保护的成员:可以访问子类,不能访问一般的公有类
  • 私有的成员:既不能访问子类,也不能访问公有类

在python中不支持正式的访问控制,但通过名字格式可以区别

  • 受保护的:以一个下划线开头的名字,被看作受保护的,如_balance
  • 私有的:以双下划线开头的名字(除了特殊的方法),被看作私有的,如__xxx