抽象、继承、组合

一、继承

1.什么是继承

继承是一种关系,描述两个对象之间(什么是什么的关系)

例如,老师,学生,程序员,搬砖工都是人类

在程序中,继承描述的是类和类之间的关系 

例如A继承了B,A就能直接使用B已经存在的方法和属性

A就称之为子类,B称之为父类,也称之为鸡肋,或者叫超类

2.为什么使用继承

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

其目的是为了重用已经有的代码,提高了重用性

3.如何使用继承

语法:

class 类名称(父类的名称):
        类的内容

在python中,一个子类可以同时继承多个父类

4.抽象

抽象就是不具体、不清晰、很模糊、看不懂的

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

正确的使用继承:

1.先抽象在继承

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

 1 class Person:
 2     def __init_(self,name,gender,age):
 3         self.name = name
 4         self.gender = gender
 5         self.age = age
 6 
 7     def say_hi(self):
 8         print('name:%s,gender:%s,age:%s'%(self.name,self.gender,self.age))
 9 
10 class Teacher(Person):
11     def teaching(self):
12         print('i am a teacher')
13 
14 class Student(Person):
15     def study(self):
16         print('i am a student')
17 
18 
19 t1 = Teacher()
20 t1.teaching()
21 
22 t2 = Student()
23 t2.study()
View Code

二、属性的查找顺序

 1 class A:
 2     text = '喵喵喵'
 3 
 4 class B(A):
 5     text = '汪汪汪'
 6 
 7 class C(B):
 8     text = '咕咕咕'
 9 
10 c = C()
11 c.text = '哔哔哔'
12 print(c.text)
View Code

对象自己的 → 所在类中 → 找父类 → 父类的父类 → Object

三、派生与覆盖

派生

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

通常子类都会写一些新的代码,不可能和父类完全一样,即通常都是派生类

所以派生类指的就是子类

覆盖

也称之为重写 overrides

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

练习:实现一个可以限制元素类型的容器(int)

 1 class Mylist(list):
 2     def __init__(self,element_type):
 3         super().__init__() #调用父类的初始化方法 来完成基本的初始化
 4         self.element_type = element_type
 5 
 6     def append(self, object):
 7         '''
 8 
 9         :param object: 要存储的元素
10         :return: None
11         '''
12         if type(object) == self.element_type:
13             #我们需要在这里访问父类的append函数来完成真正的存储操作
14             super().append(object)
15         else:
16             print('sorry your element is not %s'%self.element_type)
17 
18 m = Mylist(int)
19 
20 m.append(1)
21 
22 print(m[0])
23 m.append('123')
View Code

四、子类访问父类的内容

方式1:super(当前类名称,self).你要调的父类的属性或方法

方式2:super().你要调的父类的属性或方法

方式3:类名称.你要掉的父类的属性或方法(self)

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

 1 class Person:
 2     def __init__(self,name,age,gender):
 3         self.name = name
 4         self.age = age
 5         self.gender = gender
 6 
 7     def say_hi(self):
 8         print('hello my name is %s,i am %s years old,i am a %s'%(self.name,self.age,self.gender))
 9 
10 class Student(Person):
11     def __init__(self,name,age,gender,num):
12         super().__init__(name,age,gender)
13         self.num = num
14 
15     def say_hi(self):
16         super().say_hi()
17         print('my num is %s'%self.num)
18 
19 s1 = Student('jason',18,'boy','007')
20 s1.say_hi()
View Code

五、组合

也是一种关系,描述两个对象之间,是XX有XX的关系

什么时候使用组合:如果两个类之间,没有太大的关系,完全不属于同类

组合相比继承,耦合度更低了

class Phone:
    def __init__(self,name,color,price):
        self.name = name
        self.color = color
        self.price = price

    def call(self):
        print('正在呼叫...')

    def send_msg(self):
        print('正在发送短信...')

class Student:
    def __init__(self,name,age,phone):
        self.name = name
        self.age = age
        self.phone = phone

    def say_hi(self):
        print('name:%s,age:%s'%(self.name,self.age))

phone = Phone('iPhoneXs','black','7000')

s1 = Student('tank',18,phone)
s1.phone.call()
原文地址:https://www.cnblogs.com/spencerzhu/p/11247272.html