继承

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
原文地址:https://www.cnblogs.com/zrh-960906/p/11247438.html