首页 > 其他分享 >面向对象之派生和组合

面向对象之派生和组合

时间:2024-01-29 14:56:24浏览次数:28  
标签:__ name 组合 派生 self posts days 面向对象 def

面向对象之派生和组合

派生

  • 派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法

一、派生的方法

  • 子类是必须要派生出自己的数据属性不然就无数据属性可用
  • 子类无法使用父类中__init__定义的属性
class Person(object):
    def __init__(self, name, age):
        self.name = name


class Teacher(Person):
    def __init__(self, name):
        self.name = name

    def get_name(self):
        print(f'老师的名字是{self.name}')


teacher_1 = Teacher('Xanadu')
teacher_1.get_name()  # 名字是Xanadu
  • 那怎么样可以使用继承的父类中__init__定义的属性呢?有以下两种方法

[1]指名道姓的调用__init__方法

class Person(object):

    def __init__(self, name):
        self.name = name


class Teacher(Person):
    def __init__(self, name):
        #指名道姓的使用父类中的__init__方法
        Person.__init__(self, name)
        self.name = name

    def get_name(self):
        print(f'老师的名字是{self.name}')


teacher_1 = Teacher('Xanadu')
teacher_1.get_name()  # 老师的名字是Xanadu

[2]超类(super()

  • 调用super()会得到一个特殊的对象
  • 该对象专门用来引用父类的属性
  • 且严格按照MRO规定的顺序向后查找
class Person(object):

    def __init__(self, name):
        self.name = name


class Teacher(Person):
    def __init__(self, name):
        super().__init__(name)
        self.name = name

    def get_name(self):
        print(f'老师的名字是{self.name}')


teacher_1 = Teacher('Xanadu')
teacher_1.get_name()  # 老师的名字是Xanadu
  • 提示:在Python2中super的使用需要完整地写成super(自己的类名,self) ,而在python3中可以简写为super()
  • 当你使用super()函数时,Python会在MRO列表上继续搜索下一个类
  • 只要每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个MRO列表,每个方法也只会被调用一次
  • 使用super调用的所有属性,都是从MRO列表当前的位置往后找,千万不要通过看代码去找继承关系,一定要看MRO列表

[3]小结

  • 这两种方式的区别是:
    • 方式一是跟继承没有关系的,而方式二的super()是依赖于继承的
    • 并且即使没有直接继承关系,super()仍然会按照MRO继续往后查找

组合

  • 在一个类中以另外一个类的对象作为数据属性,称为类的组合。

一、组合的使用

  • 组合与继承都是用来解决代码的重用性问题。
  • 不同的是:
    • 继承是一种“是”的关系,比如老师是人、学生是人,当类之间有很多相同的之处,应该使用继承;
    • 而组合则是一种“有”的关系,比如工资有税,有交税的等级,老师有税前工资和税后工资,当类之间有显著不同,并且较小的类是较大的类所需要的组件时,应该使用组合
class Level(object):
    def __init__(self, days, posts):
        self.days = days
        self.posts = posts
        self.daily = Daily(posts)

    def get_level(self):
        if int(self.days) * self.daily.get_daily() > 10000:
            return 0.2
        else:
            return 0.1


class Daily(object):
    def __init__(self, posts):
        self.posts = posts

    def get_daily(self):
        if self.posts == '普通职员':
            return 300
        else:
            return 500


class Tax(object):
    def __init__(self, days, posts):
        self.days = days
        self.daily = Daily(posts)
        self.level = Level(days, posts)

    def get_tax(self):
        return int(self.days) * self.daily.get_daily() * self.level.get_level()


class Wages(object):
    def __init__(self, days, posts):
        self.days = days
        self.posts = posts
        #工资有交税的等级
        self.level = Level(days, posts)
        # 工资有日薪
        self.daily = Daily(posts)
        # 工资有税
        self.tax = Tax(days, posts)

    def wages(self):
        days = int(self.days)
        print(f'税前工资是{days * self.daily.get_daily()}')

    def true_wages(self):
        days = int(self.days)
        print(f'税后工资是{days * self.daily.get_daily() - self.tax.get_tax()}')


my_wages = Wages(30, '普通职员')
my_wages.wages()  # 税前工资是9000
my_wages.true_wages()  # 税后工资是8100.0
my_wages_1 = Wages(30, '经理')
my_wages_1.wages()  # 税前工资是15000
my_wages_1.true_wages()  # 税后工资是12000.0
  • 此时对象my_wages集对象独有的属性、Wages类中的内容、Tax类中的内容于一身(都可以访问到),是一个高度整合的产物
  • 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好

二、组合和继承的区别

  • 组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,

[1]继承的方式

  • 通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。
  • 当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人

[2]组合的方式

  • 用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...

标签:__,name,组合,派生,self,posts,days,面向对象,def
From: https://www.cnblogs.com/taoyuanshi/p/17994495

相关文章

  • 在Python的Tkinter库中,`ttk.Combobox`是一个组合框控件,它允许用户从下拉列表中选择一
    在Python的Tkinter库中,`ttk.Combobox`是一个组合框控件,它允许用户从下拉列表中选择一个选项,也可以让用户输入内容。以下是一些主要的参数和方法:1.**创建Combobox**¹²:  ```python  importtkinterastk  importtkinter.ttkasttk  root=tk.Tk()  ......
  • 今日回顾-回溯算法-17. 电话号码的字母组合
    注意点&感悟:我知道为什么,当初有些学霸说要复习了。因为有的知识点,你一遍没学会,自然要重复学习。所为复习,就是再学一遍。而简单的知识点,就不需要复习了,你已经明显知道自己掌握了,就不需要复习了。而预习呢?是为了,让提前学一遍,更多的是针对那些上课时间有限,以及学生等不及的情况......
  • “类图”之旅UML继承(泛化),实现,关联依赖,组合聚合.
     开启“类图”之旅说到对系统代码中的模型梳理,其实最好的方式还是使用UML类图。上个章节中老猫没有展开和大家分享UML类图,一个是由于篇幅的原因,第二个是老猫觉得类图对于咱们后续阅读框架源码以及底层设计模式有着相当大的帮助,所以很有必要将其作为单独一篇来和大家分享。如......
  • 面向对象基础 成员变量、成员方法、构造方法、this关键字、静态字段、静态方法..
    成员变量与局部变量的区别:  1.作用域:成员变量作用于整个类,局部变量只作用于它所属的范围(函数、语句)  2.生命周期&位置:成员变量存储在堆内存中,是属于对象的,随着对象存在消失。局部变量存储在栈内存中,是属于他所属的范围的,使用完自动释放。  3.初始值:成员变量有默认初始......
  • day25 代码随想录算法训练营 17. 电话号码的字母组合
    题目:17.电话号码的字母组合我的感悟:一时间没理解没关系,只要不放弃,就会成长!!!理解难点:index是独立集合的起点,需要理解它。有些东西就是时间的积累代码难点:代码示例:classSolution:def__init__(self):self.letterMap=["",#0......
  • day01-面向对象高级
    day01——面向对象高级各位同学,接下来的三天课程中,我们继续学习面向对象的相关课程。面向对象是写Java程序的核心套路,如何你不懂面向对象,那就相当于Java你白学了。所以在接下来的三天时间里,各位同学也需要克服重重困难好好学习。前面我们说过面向对象最核心的套路是:设计对象来处......
  • [office] Excel里ctrl+h有什么作用-Excel中ctrl+h组合快捷键的几大功能介绍[office] E
    处理Excel文件时,使用Ctrl+H组合快捷键能干嘛?ctrl+h有什么作用?我们在处理Excel文件时,合理使用快捷键能事半功倍,今天小编要介绍的是Ctrl+H快捷键。有小伙伴就说了,这不就是打开“查找和替换”对话框嘛,其实不然,它还有其他妙用,感兴趣的小伙伴看过来哦。Excel里ctrl+h组合快捷键有什么作......
  • C# 面向对象编程进阶:构造函数详解与访问修饰符应用
    C#构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C#服务器创建一个构造函数://创建一个Car类classCar{publicstringmodel;//创建一个字段//为Car类创建一个......
  • WSL & VS code的神仙组合
    微软经常自己搞些新花样,比如把WSL和VSCode搞到一起。因为WSL默认不带图形界面,VIM的学习成本太高,所以通过VScode的WSL插件,就可以让编辑器直接连接到虚拟机,然后再VScode里面写代码就好了,他妈的好神奇。插件名字就叫WSL,微软自己出品,VScode安装后会自动虚拟机里装一个WSL的插件......
  • C# 面向对象编程进阶:构造函数详解与访问修饰符应用
    C#构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C#服务器创建一个构造函数://创建一个Car类classCar{publicstringmodel;//创建一个字段//为Car类创建一......