zoukankan      html  css  js  c++  java
  • 继承

    1.什么是继承

      继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

    2.为什么要使用继承

      继承的一方可以直接使用被继承一方的东西,  其目的是为了重用已经有的代码,提高重用性

    语法:
    class 类名称(父类的名称):
            类的内容
    
    class Base:
        desc = '这是一个基类'
        def show_info(self):
            print(self.desc)
        def make_money(self):
            print('一天赚一个亿')
    class SubClass(Base):
        pass
    obj = SubClass()
    obj.make_money()   # 一天赚一个亿
    print(obj.desc)   #  这是一个基类

    3.抽象

      抽象即抽取类似或者比较像的部分。

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

      使用继承:先抽象在继承,继承一个已经现存的类,  然后扩展或是修改原始功能

    抽取老师和学生中相同的部分形成person类
    class Person:
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender
        def say_hi(self):
            print('name:%s,gender:%s,age:%s'%(self.name,self.age,self.gender))
    class Teacher(Person):
        def teaching(self):
            print('老师教学生写代码')
    t1 = Teacher('jack','male',20)
    t1.say_hi()   # name:jack,gender:male,age:20
    class A:
        text = "haha"
    
    class B(A):
        text = "heihei"
    
    b = B()
    b.text = "xixi"
    
    print(b.text)  # xixi

    属性的查找顺序      对象自己的->所在类的->找父类->父类的父类->Object

    4.派生

      当子类添加自己新的属性或者在自己那里重新定义这些属性(不会影响到父类)也称之为覆盖,这个子类就称之为派生类,派生类指的是子类

    class Person:
        def say_hi(self):
            print('hello')
    class Student(Person):
        def say_hi(self):
            print('hello world')
    stu = Student()
    stu.say_hi()   # hello world
    实现一个能够限制元素类型的列表类
    class MyList(list):
        def __init__(self,element_type):
            super().__init__()  # 调用父类的初始化,来完成基本的初始化
            self.element_type = element_type
        def append(self,object):
            if type(object) == self.element_type:
                super(MyList,self).append(object)   # 访问父类的append函数完成存储操作
            else:
                print('sorry sir, you element type not is %s' % self.element_type)
    m = MyList(int)   # 创建指定要存储的元素类型
    m.append(1)
    print(m[0])   # 1
    m.append('121212')   # sorry sir, you element type not is <class 'int'>

    5.子类访问父类的内容

    语法:
    方式一: super(当前类名称,self).你要调用父类的属性方法 方式二: supper().你要调用的父类的属性或方法 方式三: 类名称.你要调用的父类属性或方法
    class Parent: test = 'abc' def say_something(self): print('anything') class Sub(Parent): def show_info(self): print(super().test) super().say_something() sub = Sub() sub.show_info() # abc anything

    6.当继承一个现有的类,并且覆盖了父类的init方法时,必须在初始化init方法的第一行用super调用父类的初始化方法. 并传入父类所需的参数

    # 为什么要在初始化方法中,调用父类的初始化方法
    class Person:
        def __init__(self,name,gender,age,*args):
            self.name = name
            self.gender = gender
            self.age = age
            self.aa()
        def aa(self):
            print('aa run')
        def say_hi(self):
            print('name:%s,gender:%s,age:%s'%(self.name,self.gender,self.age))
    class Student(Person):
        def __init__(self,name,gender,age,number):
            super().__init__(name,gender,age)
            self.number = number
        def say_hi(self):
            super().say_hi()
            print('number:%s'%self.number)
    stu = Student('rose','mael',20,'old01')   # aa run
    stu.say_hi()   # name:rose,gender:mael,age:20         number:old01
    
    

    7.组合

      将一个对象作为另一个对象的属性, 组合目的是重用代码

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

    class Phone:
        def __init__(self,price,kind,color):
            self.price = price
            self.kind = kind
            self.color = color
        def call(self):
            print('正在呼叫')
        def send_message(self):
            print('正在发送短信')
    class Student:
        def __init__(self,name,gender,phone):
            self.name = name
            self.gender = gender
            self.phone = phone
        def show_info(self):
            print("name:%s ,gender:%s"%(self.name,self.gender))
    phone = Phone(1000,'apple','red')
    stu1 = Student('rose','male',phone)   # 正在呼叫

    菱形继承: python支持多进程,  python3中任何类都直接或间接继承Object,  object为这些类提供了很多常用的方法和属性,这样可以直接使用这些属性或方法

    新式类: 任何显式或隐式地继承object的类都称之为新式类, 新式类都是object的子类, python3中全都是新式类

    经典类: 不是Object的子类 ,仅在python2中存在,Python2中如果声明继承object作为父类,就称为新式类

    ⼴度优先:  当出现了菱形继承时, 则从左到右,从下到上,当遇到了共同父类时类则换下⼀条查找路径

    深度优先:  按照从左到右, 从下到上一直找到object为止

    class A:
        pass
    class B:
        pass
    class C:
        pass
    class Test(A,B,C):
        pass
    print(Test.mro())   # [<class '__main__.Test'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]
    class A(object):
        pass
    print(A.mro())  # [<class '__main__.A'>, <class 'object'>]
    print(A.__dict__)   # {'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
    dayehui
  • 相关阅读:
    数据放在服务端和客户端的利与弊
    python异步I/O并发
    view
    mysql千万或者上亿的数据怎么设计数据库
    Django(一)
    JQuery
    BOM与DOM
    JavaScript
    CSS(二)
    CSS介绍
  • 原文地址:https://www.cnblogs.com/zrh-960906/p/11247438.html
Copyright © 2011-2022 走看看