zoukankan      html  css  js  c++  java
  • 类的继承

    类的继承

    类的三个特点:封装,继承,多态。

    什么是继承

    继承是一种关系,描述两个对象之间,什么是什么的关系。在程序中,继承是类与类之间的关系。例如a继承了b,a就能直接使用b已经存在的方法和属性。a称之为子类,b称之为父类,也称之为基类。

    为什么要用继承?

    继承的一方可以使用被继承的一方已经有的东西。

    其目的是为重用已经有的代码,在python中为了提高程序的重用性。

    继承可以使用父类中所有的属性和方法。

    在python中,一个子类可以同时继承多个父类。继承父类,则会有父类的所有属性和方法。

    如何使用继承

    子类继承父类的所有那内容,可以继承多个。

    语法:

    class ParentClass1():
        pass
    
    class ParentClass2():
        pass
    
    class SubClass(ParentClass1,ParentClass2):
    	pass
    	
    

    抽象

    不具体,不清晰,很模糊,看不懂

    将多个子类中相同的部分进行出抽取,形成一个新的类,这个过程也称之为抽象的过程。

    正确的使用继承:

    ​ 1.先抽象再继承

    ​ 2.继承一个已经现存的类,扩展或是修改原始的功能

    属性的查找顺序

    先查找对象自己的—>所在类中—>找父类—>父类的父类—>Object

    派生

    当一个子类中出现了与父类中不同的内容时,这个子类就是称之为派生类。

    通常子类都会写一些新的代码,不可能和父类完全一样,既通常都是派生类,所以派生类指的是据说子类。

    覆盖

    也称之为重写overrides

    当子类出现了与父类名称完全一样的属性或是方法。

    练习:

    实现一个可以限制元素类型的容器(字典,列表,元组,集合,字符串)

    
    

    子类中访问父类的内容

    继承父类的同时自己有__init__,然后也需要父类的__init__。

    子类访问父类的属性或方法super().名字

    如果你继承一个已有的类,并且你覆盖了__init__,一定先调用父类中的__init__

    语法:

    方式1:
    super(当前类名称,self).你要调的父类的属性或是方法
    方式2:
    super().你要调的父类的属性或是方法
    方式3:
    类名称.你要调的父类的属性或是方法(self)
    # 方法3与继承无关
    

    强调再强调

    当你继承一个现有的类,并且你覆盖了父类的__init__方法时,必须再初始化方法的第一行调用父类的初始化方法,并传入父类所需的参数。

    组合

    组合也是以一种关系,描述两个对象之间是什么关系有什么关系。类对象可以引用/当作参数传入/当作返回值/当作容器元素,类似于函数对象。

    例如,学生有手机,游戏中角色拥有某些装备

    将一个对象作为另一个对象的属性。(既有什么有什么)

    组合的目的:

    也是为了重用现有代码

    什么时候使用继承:分析两个类的关系,到底是不是什么是什么的关系。

    什么时候使用组合:如果两个类之间没有太大的关系,完全不属于同类。另外组合相比继承,耦合性更低了。

    菱形继承

    首先明确python支持多继承

    补充:新式类与经典类

    python3中任何类都是直接或间接继承了Object

    新式类,任何显式或隐式地继承自Object的类就称之为新式类。python3中全都是新式类。

    经典类,既不是object的子类,仅在python2中出现

    当出现了菱形继承时,新式类,先深度优先查找,当遇到了共同父类时子再广度优先查找(老祖宗最后找)。而经典类就是深度优先(一路找到底,再找旁边的)。

    类的派生

    类的派生:添加新的属性的同时还能继承父类的所有东西。

    派生类:就是子类

    派生:继承父类属性的同时增加新的属性,然后使用super().__init__()继承父类的属性。

    class Foo:
        def f1(self):
            print('Foo.f1')
        def f2(self):
            print('Foo.f2')
            self.f1()
    class Bar(Foo):
        def F1(self):
            print('Bar.f1')
    
    b = Bar()
    print(b.__dict__)
    b.f2()
    

    类的派生

    类的派生:添加新的属性的同时还有继承父类的所有东西

    派生:继承父类属性的同时增加新的属性,然后使用super().__init__()

    class Animal():
        def __init__(self,height,weight):
            self.height = height
            self.weight = weight
        def jiao(self):
            print(self.__class__.__name__,'叫')
    
    class Xingxing(Animal):
        def __init__(self,gender,height,weight):
            super().__init__(height,weight):
                self.gender = gender
        
        def sleep(self):
            print('睡觉')
    
    class People(XingXing):
        def __init__(self,name,age,height,weight,gender):
            super().__init__(height,weight,gender):
                super().__init__(height,weight,gender)
                
                
                self.name = name
                self.age = age
         
        def read(self):
            print('read')
        
        def jiao(self):
            print('jiao')
                
        
    
  • 相关阅读:
    ASP.NET中如何防范SQL注入式攻击?(转)
    打开D盘时速度奇慢?
    Visual Studio 2008 下载地址
    如何利用XML文件,做为配置参数?
    如何将一个表中的数据INSERT INTO 到另一个表中?
    拖延交货或惹万人诉讼 消费者称戴尔态度恶劣
    NHibernate Linq中Null值排序的解决方法
    NHibernate3剖析:Query篇之NHibernate.Linq标准查询
    Nhibernate出现No row with the given identifier exists问题的产生原因及解决方法
    Nhibernate使用动态Expression的问题解决
  • 原文地址:https://www.cnblogs.com/zuihoudebieli/p/11261892.html
Copyright © 2011-2022 走看看