设为首页 加入收藏

TOP

Python-16-继承、封装、多态(二)
2019-08-04 00:19:52 】 浏览:135
Tags:Python-16- 继承 封装 多态
类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
20 # 所以,查找顺序:A --> B --> D --> C 21 # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了 22 a.bar() 经典类多继承
 1 class D(object):
 2     def bar(self):
 3         print 'D.bar'
 4 
 5 class C(D):
 6     def bar(self):
 7         print 'C.bar'
 8 
 9 class B(D):
10     def bar(self):
11         print 'B.bar'
12 
13 class A(B, C):
14     def bar(self):
15         print 'A.bar'
16 
17 a = A()
18 # 执行bar方法时
19 # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
20 # 所以,查找顺序:A --> B --> C --> D
21 # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
22 a.bar()
新式类多继承

3. 继承原理

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如

>>> F.mro() #等同于F.__mro__
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类

4. 在子类中调用父类的方法

  • 指明道姓
class Dad(object):
    money = 100000000
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def hit_son(self):
        print('%s 正在打儿子' % self.name)

class Son(Dad):
    def __init__(self, name, age):
        Dad.__init__(self, name, age)
  • super 
class Dad(object):
    money = 100000000
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def hit_son(self):
        print('%s 正在打儿子' % self.name)

class Son(Dad):
    def __init__(self, name, age):
        super().__init__(name, age)

5. 利用继承二次加工基础属性(包装)

包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工)

class List(list):  # 继承list所有的属性,也可以派生出自己新的,比如append
    def append(self, project):
        if type(project) is str:
            super().append(project)
        else:
            raise TypeError('must be str')


l = List('hello')
l.append(123)  # 报错
l.append('123')

6. 接口与归一化设计

 1 =================第一部分:Java 语言中的接口很好的展现了接口的含义: IAnimal.java
 2 /*
 3 * Java的Interface接口的特征:
 4 * 1)是一组功能的集合,而不是一个功能
 5 * 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作
 6 * 3)接口只定义函数,但不涉及函数实现
 7 * 4)这些功能是相关的,都是动物相关的功能,但光合作用就不适宜放到IAnimal里面了 */
 8 
 9 package com.oo.demo;
10 public interface IAnimal {
11     public void eat();
12     public void run(); 
13     public void sleep(); 
14     public void speak();
15 }
16 
17 =================第二部分:Pig.java:猪”的类设计,实现了IAnnimal接口 
18 package com.oo.demo;
19 public class Pig implements IAnimal{ //如下每个函数都需要详细实现
20     public void eat(){
21         System.out.println("Pig like to eat grass");
22     }
23 
24     public void run(){
25         System.out.println("Pig run: front legs, back legs");
26     }
27 
28     public void sleep(){
29         System.out.println("Pig sleep 16 hours every day");
30     }
31 
32     public void speak(){
33         System.out.println("Pig can not speak"); }
34 }
35 
36 =================第三部分:Person2.java
37 /*
38 *实现了IAnimal的“人”,有几点说明一下: 
39 * 1)同样都实现了IAnimal的接口,但“人”和“猪”的实现不一样,为了避免太多代码导致影响阅读,这里的代码简化成一行,但输出的内容不一样,实际项目中同一接口的同一功能点,不同的类实现完全不一样
40 * 2)这里同样是“人”这个类,但和前面介绍类时给的类“Person”完全不一样,这是因为同样的逻辑概念,在不同的应用场景下,具备的属性和功能是完全不一样的 */
41
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇测试代码的练习——python编程从.. 下一篇学习9.内容# 1.函数初识 # 2.函数..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目