首页 > 其他分享 >19.面向对象【三】

19.面向对象【三】

时间:2024-05-07 19:22:54浏览次数:15  
标签:__ name 19 self sex 面向对象 age def

【一】继承

1)概念

  • 继承是一种创建新类的方式,新建的类可以继承一个或多个类的属性

  • 可以继承父类的所有属性和方法,实现代码的去重

class Student(School):
# 继承的类叫父类 School
# 新建的类叫子类 Student

2)单继承

class Person(object):
    height = 170
    weight = 70
class Student(Person):
    def __init__(self, name):
        self.name = name
    def eg(self):
        print(f'{self.name}身高{self.height}体重{self.weight}')
st1 = Student('diva')
st1.eg()

3)多继承

class Height(object):
    height = 170
class Weight(object):
    weight = 70
class Student(Height, Weight):
    def __init__(self, name):
        self.name = name
    def eg(self):
        print(f'{self.name}身高{self.height}体重{self.weight}')
st1 = Student('diva')
st1.eg()

4)查看继承的父类

__base__:只打印一个继承的父类
__bases__:元组中放入所有继承的父类

【二】经典类和新式类

  • 经典类

    • 在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类
  • 新式类

    • 在python2中,显式地声明继承object的类,以及该类的子类,都是新式类

在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类

【三】继承与抽象

  • 继承

    • 是子类与父类之间的关系,是一种什么是什么的概念
  • 抽象

    • 抽取类似或比较像的部分
    • 主要作用是划分类别

【四】属性查找顺序

1)不隐藏属性

class Foo:
    def f1(self):
        print('Foo.f1')
    #【2】找到f2,执行
    def f2(self):
        print('Foo.f2')
        #【3】self 是谁就去谁里面找
        self.f1()
#【1】从Bar未找到f2,就去父类Foo找
class Bar(Foo):
    #【4】因为是通过Bar实例化得到的对象,所以执行Bar的f1
    def f1(self):
        print('Bar.f1')
b = Bar()
b.f2()
# Foo.f2
# Bar.f1

2)隐藏属性

class Foo:
    #【4】 __f1 --> _Foo__f1
    def __f1(self):
        print('Foo.f1')
    #【2】找到f2,执行
    def f2(self):
        print('Foo.f2')
        #【3】变形之后就只能在自己的类里面找,没办跳到别的类里面
        self.__f1()
#【1】从Bar未找到f2,就去父类Foo找
class Bar(Foo):
    def __f1(self):
        print('Bar.f1')
b = Bar()
b.f2()
# Foo.f2
# Foo.f1

3)总结

如果属性不封装的情况下,谁实例化得到的self 就去谁里面找

如果属性封装的情况下 ,只能在当前所在的类的民称空间里面找

【五】菱形继承问题

1)深度优先

  • 当类是经典类时,多继承情况下,在查找属性不存在时,会按照深度优先的方式查找下去

2)广度优先

  • 当类是新式类时,多继承情况下,在查找属性不存在时,会按照广度优先的方式查找下去

【六】派生

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

1)派生方法

  • 子类可以派生出自己的属性,在进行属性查找时,子类中的属性名会优先于父类被查找
  • 子类也可以添加自己新的属性或重新定义这些属性,之后的调用会以自己的为准
class People:
    school = '清华大学'
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
class Teacher(People):
    # 派生 : 派生出自己新的属性,在进行属性查找时,子类中的属性名会优先于父类被查找
    def __init__(self, name, sex, age, title):
        self.name = name
        self.sex = sex
        self.age = age
        self.title = title
    def teach(self):
        print(f'{self.name} is teaching')
# 只会找自己类中的__init__,并不会自动调用父类的
obj = Teacher('dream', 'male', 18, '高级讲师')
print(obj.name, obj.sex, obj.age, obj.title)
# dream male 18 高级讲师

2)指名道姓的调用某一类的函数

class People:
    school = '清华大学'
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
class Teacher(People):
    def __init__(self, name, sex, age, title):
        # 直接调用 父类 中 的 __init__ 方法
        # 调用的是函数,因而需要传入self
        People.__init__(self, name, age, sex)
        self.title = title
    def teach(self):
        print(f'{self.name} is teaching')
obj = Teacher('dream', 'male', 18, '高级讲师')
print(obj.name, obj.sex, obj.age, obj.title)
# dream male 18 高级讲师

3)超类(super())

  • 调用super()会得到一个特殊的对象
  • 该对象专门用来引用父类的属性
  • 且严格按照MRO规定的顺序向后查找
class People:
    school = '清华大学'
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
class Teacher(People):
    def __init__(self, name, sex, age, title):
        # 直接调用 父类 中 的 __init__ 方法
        # 调用的是绑定方法,因此会自动传入self,但是需要传入相应的参数
        super().__init__(name, sex, age)
        self.title = title
    def teach(self):
        print(f'{self.name} is teaching')
obj = Teacher('dream', 'male', 18, '高级讲师')
print(obj.name, obj.sex, obj.age, obj.title)
# dream male 18 高级讲师

【六】组合与继承的区别

  • 组合
    • 在一个类中以另外一个类的对象作为数据属性
    • 用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系
  • 继承
    • 通过继承建立了派生类与基类之间的关系,它是一种'是'的关系

标签:__,name,19,self,sex,面向对象,age,def
From: https://www.cnblogs.com/Mist-/p/18178195

相关文章

  • 微软或开发新模型与 OpenAI 竞争;苹果或将推出 Apple Pencil Pro丨 RTE 开发者日报 Vol
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点......
  • (VKL系列)超低功耗LCD液晶显示驱动IC-VKL76 SSOP28,19*4 76点阵,超低工作电流约7.5微安,
    VKL076概述:VKL076是一个点阵式存储映射的LCD驱动器,可支持最大76点(19SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。功能特点:•  工......
  • C#中面向对象的一些基础概念
    案例所创建的.cs如下:OOP--ObjectOrientedProgramming实例化类baseclassbc=newbaseclass();subclasssc=newsubclass();bc.Func();sc.Func();里氏转换子类对象可以直接赋值给父类变量子类可以调用父类对象,但是父类只有调用自己父类中如果是子类对象,则......
  • Luminar Neo 1.19.0 (macOS Universal) - 创新 AI 图像编辑器
    LuminarNeo1.19.0(macOSUniversal)-创新AI图像编辑器利用尖端的人工智能生成技术,轻松增强照片效果请访问原文链接:LuminarNeo1.19.0(macOSUniversal)-创新AI图像编辑器,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org提升您的照片编辑能力。你想象......
  • 苹果挖走大量谷歌人才,建立神秘人工智能实验室;李飞飞创业成立「空间智能」公司丨 RTE
     开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个......
  • Java面向对象编程概念
    面向对象编程(OOP)概念,如类、对象、继承、封装、多态概念:面向对象编程(Object-OrientedProgramming,简称OOP)是一种程序设计范型或编程范式。这种范式使用“对象”来设计应用程序和系统的各个部分。在面向对象编程中,万物皆对象,程序被视作一系列对象的集合,这些对象通过消息传递来交互......
  • CF1967C. Fenwick Tree-算子展开,树状数组的结构
    link:https://codeforces.com/problemset/problem/1967/C题意:定义\(f(a)=s\)中的\(f\)表示把序列\(a\)映射为其树状数组的操作(\(s\)就是对应的树状数组),并且操作是在取模下作的,已知\(f^k(a)=b\),已知序列\(b\)和自然数\(k\),求\(a\).\(1\leqn\leq2\times10^5,1\leq......
  • 最多192核心!AMD Zen5 EPYC已大规模出样
    今年在处理器领域最值得期待的就是AMDZen5架构了,官方也已确认桌面、笔记本、服务器三大领域下半年都会迎来新品,样品也在顺利推进中。AMDCEO苏姿丰对分析师和投资者透露,代号Turin(都灵)的下一代Zen5EPYC正在大规模出样,将在今年晚些时候如期发布。她表示,TurinEPYC目前看起来非......
  • 07.面向对象编程
    Java的核心思想就是OOP(面向对象编程)1.面向对象面向对象编程:Object-OrientedProgramming,OOP)本质:以类的方式组织代码,以对象的组织(封装)数据2.对象的创建2.1.创建与初始化对象创建对象:new使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化......
  • P3193 [HNOI2008] GT考试 题解
    之前学矩阵乘的时候做的题,当时因为不会\(kmp\)搜索一稀里糊涂过去了,现在填个坑。头图是\(Logos\)!P3193[HNOI2008]GT考试题链:洛谷题库题目大意:求有多少个长度为\(n\)的数字串的子串中不包含给出的长度为\(m\)位的串,范围\(n<=1e9\),$m<=20$。思路:首先考虑DP,令\(......