首页 > 其他分享 >面向对象(三大特征、继承下的查找、super、组合)

面向对象(三大特征、继承下的查找、super、组合)

时间:2023-06-29 15:22:04浏览次数:32  
标签:__ course 继承 self 面向对象 super class 三大

面向对象有三大特征:封装、继承和多态

继承

继承其实和封装差不多,就是新建的类称为是子类或派生类,多个子类继承同一个类,这个类教父类或基类

1.为什么要继承

  类解决什么问题:解决的是对象与对象之间代码冗余问题

  继承解决什么问题:解决的是类与类之间的代码冗余问题

2.怎样继承

  新式类:继承了objcet类的所有都新式类

  经典类:没有继承object类的所有的都是经典类

  ps:只要在python2中才区分经典类和新式类,因为在python3中都是新式类

 

子类可以继承多个父类:

class Aaa:
    a = 111

class Bbb:
    b = 222

class Ccc(Aaa, Bbb):    # Ccc是子集,Aaa和Bbb都是父集
    c = 333

print(Ccc.b)  # 222

 

单继承下的属性查找

单继承就是一个类只继承一个类

查找顺序:

  先从对象自己的名称空间中查找,然后去产生这个对象的类中查找,最后在去继承的父类中查找,如果还找不到就报错

 

多继承下的属性查找

多继承就是一个类继承多个类

多继承下的属性查找分为:

  1.菱形查找

    就是一个子类中多条线继承同一个父集

    代码会被子类从头到尾依次扫描一遍,当需要调用父类时,会允许最后一条链接父类的线

  2.非菱形查找

    就是一个子类中只有一条线存在一个父集

 

多态与多态(理论)

多态就是一种事物有多种形态,就是多个类中他们有一样的方法,它们就是一种类型的多态

如何让一个子类必须满足某一个方法:

强制Bbb中必须存在aaa的方法。

在定义父类的时候在括号内写入   metaclass=abc.ABCMeta ,这时这个父类就变成了抽象类,

只能被继承,不能被实际化,抽象类中的方法,而抽象方法不再实现具体功能,而是用来现在子类的行为

抽象类的方法上方必须添加语法糖   @abc.abstractmethod

### 这种方法python是不推荐的,python推荐的是鸭子类型

import abc  # 导入函数 抽象的

class Aaa(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def aaa(self):
        pass

class Bbb(Aaa):
    def aaa(self):
        pass

    pass

res = Bbb()

 

super关键字

当一个类继承父类时,在类中需要使用父类产生的对象时,可以用super关键字代替父类名

super严格依赖继承

继承的类名.__init__(self,形参)

被替代

super(当前类名,self).__init__(形参)      python2

super().__init__(形参)

当类中存在多个super关键字时,需要用mro配合使用查看super所指向的父类

 

特殊情况

class A:
    def test(self):
        super().test()

class B:
    def test(self):
        print('from B')

class C(A, B):
    pass

c = C()
print(C.mro())
#  [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
c.test()  # from B

 

组合

组合就是一个对象的某个属性的值是另一个对象

 

class People():
    def __init__(self, name, age, gender):
        """这个是指名道姓的调用方法,不依赖于继承"""
        self.name = name
        self.age = age
        self.gender = gender


"""
继承一般用在什么是什么的时候
组合一般用在什么有什么的时候
"""


class Course:
    def __init__(self, course_name, course_price, course_period):
        """这个是指名道姓的调用方法,不依赖于继承"""
        self.course_name = course_name
        self.course_price = course_price
        self.course_period = course_period


python = Course("python", 10000, '6mon')
linux = Course("linux", 20000, '5mon')


class Student(People):
    def __init__(self, name, age, gender, course=None):
        if course is None:
            course = []
        """这个是指名道姓的调用方法,不依赖于继承"""
        super(Student, self).__init__(name, age, gender)
        self.courses = course

    def choose_course(self):
        pass


stu = Student('kevin', '19', 'male')
# print(stu.course_name)
# print(stu.course_price)

stu.courses.append(python)  # stu.courses ====> [python对象]
stu.courses.append(linux)  # stu.courses ====> [python对象, linux对象]
print(stu.courses)

 

标签:__,course,继承,self,面向对象,super,class,三大
From: https://www.cnblogs.com/caicaix/p/17512630.html

相关文章

  • 面向对象的高级原则
    1、开放/封闭原则模块应该对扩展开放,对修改关闭。每个类型应该是固定的,不在未来有任何变化,更不要修改类型的源代码。即类型对修改关闭。每次发生变化时,要通过添加新代码来增强现有类的行为,而不是修改原有代码。可以使用如下两种方式:①用组合创建新的类型。②使用安全干净的继......
  • 普元软件获一亿战略投资 董事长刘亚东谈三大核心竞争优势
     本文发表于2009-10-2818:5311/6/200910:31:24AM今天下午,国内领先的SOA中间件厂商普元软件对外正式宣布:公司成功获得共计1亿元人民币的战略投资,其中新开发联合创业投资企业(新开发创投)投资8000万元,天津和光股权投资基金(天津和光)投资2000万元。不接受对赌协议在谈到对投资人......
  • 面向对象之魔术方法(内置方法),反射,异常之自定义异常
    魔术方法(内置方法)(面试题)#类里面内置的双下划线开头的一些方法,他们具有特殊的功能,我们称之为是魔术方法,简称魔法比如:__init__"""魔术方法的学习只需要掌握每个方法什么时候触发或者执行"""1.__str__,__repr__方法#__str__,__repr__方法classStudent():def_......
  • 面向对象之绑定方法,非绑定方法,隐藏属性,property装饰器,三大特征
    绑定方法#绑定给类的方法#绑定给对象的方法classStudent():school='SH'def__init__(self,name,age,gender):#self:对象自己self.name=nameself.age=ageself.gender=gender#这个就是绑定给对象的方法,有......
  • 十九、面向对象编程
    十九、面向对象编程类与对象类是总结事物特征的抽象概念,是创建对象的模板。对象是按照类来具体化的实物。类的构成类的名称:类名类的属性:一组参数数据类的方法:操作的方式或行为类的创建#classPeople(object):新式类classPeople():经典类classPeople(object):#类......
  • 面向对象程序编程6-8次PTA题目集(成绩计算系列)的总结性Blog
    1.对之前发布的6-8次PTA题目集(成绩计算系列),内容要求如下:(1)前言:总结之前所涉及到的知识点、题量、难度等情况第六次PTA题目集:知识点:此次PTA题目仅只有这一个题目,主要考的内容就是对类的使用(类似现实,对有关联的各个数据合并在一起,便于一起使用),运用正则表达式(比较苦难使用,要记住那......
  • python基础--面向对象
    1、类的写法class类名():代码... 类的创建例子classTest():#函数的构造方法def__init__(self,name):self.__name=name#这个是表示内部类的属性def__innerMethod(self):print('thisisinnermethod')#self相......
  • supervisor的使用与配置说明
    Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.一.安装1.1安装#根目录下执行安装命令yuminstallsupervisor#安装生成路径:#\etc\supervisor.d#\etc\supervisor.conf主配置......
  • 面向对象程序设计题目集总结blog3
    一、前言本次是第三次对面向对象程序设计题目集的总结分析博客。 关于知识点本次的题目集所体现的知识点重点考虑设计问题,许多题目不提供类图,或者只提供一个参考框架(只有类和类之间的关系),题目的代码量也较于前几次提升了不少。题目集七注重类的设计,通过三道设......
  • 单继承、多继承下的属性查找、super关键字、多态与多态性、组合
    单继承下的属性查找单继承:一个类只能继承一个类。classC():passclassB(C):passclassA(B):#单继承pass单继承下的属性查找顺序:先从对象本身的名称空间中查找------>产生这个对象的类中去查找 ------>继承的父类中去查找#查找属性classFoo():......