zoukankan      html  css  js  c++  java
  • 抽象、继承、组合

    一、继承

    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()
  • 相关阅读:
    redis 缓存验证码 步骤
    方法返回值 前面的<T>是什么?
    spring boot的运行原理
    在本地tomcat中调试Spring boot项目遇到的一些问题
    UEditor中上传图片的步骤
    总结彻底解决Spring MVC+Mybatis中文乱码问题
    ueditor1.4.3二次开发添加自定义Dialog
    UEditor之图片上传如何和真实项目结合
    UEditor之实现配置简单的图片上传示例 (转)
    Java比较运算符
  • 原文地址:https://www.cnblogs.com/spencerzhu/p/11247272.html
Copyright © 2011-2022 走看看