黑马程序员技术交流社区

标题: 【上海校区】类的继承 [打印本页]

作者: 不二晨    时间: 2019-3-15 16:29
标题: 【上海校区】类的继承
一、什么是继承

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
三、一些其他概念

1、保护成员

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

受保护的成员:可以访问子类,不能访问一般的公有类
私有的成员:既不能访问子类,也不能访问公有类
在python中不支持正式的访问控制,但通过名字格式可以区别

受保护的:以一个下划线开头的名字,被看作受保护的,如_balance
私有的:以双下划线开头的名字(除了特殊的方法),被看作私有的,如__xxx
---------------------
【转载,仅作分享,侵删】
作者:琪仔要转行回coder
来源:CSDN
原文:https://blog.csdn.net/lllllaaa77/article/details/88412584
版权声明:本文为博主原创文章,转载请附上博文链接!


作者: 不二晨    时间: 2019-3-20 16:55
奈斯,感谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2