继承、多继承、魔术方法知识点总结

继承,魔术,方法,知识点,总结 · 浏览次数 : 7

小编点评

```python class Father: def cook(self): print('%s做饭最好吃!!!'%self.name) class Son(Father): def money(self): super().money() # 继承爸爸类的方法 Father.money(self) # 继承爸爸类的money方法 # 测试类 xiaoming=Son('小明',20)xiaoming.watch()xiaoming.work()xiaoming.run()xiaoming.eat()xiaoming.cook() ``` **运行截图:** ``` 小明做饭最好吃!!! 小明有一万!!! 我有一万!!! 周长为:50 面积为:25 周长为:50 面积为:25 ``` **解释:** * 父类 `Father` 中定义了一个方法 `cook()`,该方法用于做饭。 * 重写类 `Son` 的 `money()` 方法,它首先调用 `Father.money()` 方法获取爸爸类的 `money()` 方法,然后调用 `Father.money()` 方法将父类的资金传递给子类。 * `Son` 类实例 `xiaoming` 继承了 `Father` 类,因此它可以调用 `Father` 中的 `cook()` 方法。 * 在 `main` 中创建了一个 `Son` 实例 `xiaoming` 并调用 `xiaoming.money()` 方法,该方法会调用 `Father.money()` 方法。 * 由于 `Son` 类继承了 `Father` 类,因此它可以正常调用 `Father` 中的方法。

正文

一、继承:简化代码避免重复
  继承的意思相当于把父类中可以使用的方法写在自己类中一个性质

例1:创建一个人类,分男人类与女人类
  属性:姓名、年龄
  方法:吃、走 ====》公共特征
  男:方法==》上班
  女:方法==》洗衣服
class People:  # 父类,可以理解为一个较为抽象的类,具体细分由下面的子类完成
    # 公共代码放置位置
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def run(self):
        print('%s走路'%self.name)
    def eat(self):
        print('吃东西')

# 继承People类:继承的意思相当于把以上可以使用的方法写在自己的类中一个性质
class man(People):   # 男人类

    def work(self):
        print('%s上班'%self.name)
# 继承People类
class woman(People):
# class woman(man):
    def watch(self):
        print('%s洗衣服'%self.name)

# 实例化
xiaoming=man('小明',20)
xiaoming.run()
xiaoming.work()
#
xiaohua=woman('小花',19)
xiaohua.run()
xiaohua.watch()
# xiaohua.work() # 不能访问小明的方法,子类之间的方法不可以互相访问,除非woman继承man类
# __bases__查看类继承的直接父级(通过类名)
print(woman.__bases__)  # (<class '__main__.man'>,) 继承 
print(man.__bases__)  #  (<class '__main__.A'>,) 继承people  
print(People.__bases__)  # (<class 'object'>,)
# print(xiaohua.__bases__) # 错误写法

运行截图:

 例2:多继承:

  重写:当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来覆盖父类的方法 

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

    def run(self):
        print('%s走路'%self.name)
    def eat(self):
        print('吃东西')

class Father(base): # 爸爸类
    def work(self):
        print('%s上班'%self.name)

    def cook(self):
        print('%s做饭好难吃'%self.name)

class Mother(base): # 妈妈类
    def watch(self):
        print('%s洗衣服' % self.name)
    def cook(self):
        print('%s做饭真好吃'%self.name)

# 如果Father在前面先继承Father类,优先级
class Son(Father,Mother):
    # 重写:当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来覆盖父类的方法
    def cook(self):

        # pass
        print('%s做饭最好吃!!!'%self.name)

xiaoming=Son('小明',20)
#
xiaoming.watch()
xiaoming.work()
xiaoming.run()
xiaoming.eat()
xiaoming.cook() # Father在前面先继承
print(Son.__mro__) # 查询类继承的顺序==  调用方法的时候依次查询     object是所有类的父类

运行截图:  

 例3:重写父类方法之后,如果又需要使用父类的方法呢?

  super().money() # 如果自己的资金不够就把父类的也拿过来

     super 函数可以调用父类的方法,在父类中也可以使用super函数

  Father.cook(self) # 这样写先继承Father类===》可以理解准确性的继承

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

    def run(self):
        print('%s走路'%self.name)
    def eat(self):
        print('吃东西')

class Father(base):
    def work(self):
        print('%s上班'%self.name)

    def cook(self):
        print('%s做饭好难吃'%self.name)

    def money(self):
        print('爸爸有10万')

class Mother(base): # 多继承
    def watch(self):
        print('%s洗衣服' % self.name)
    def cook(self):
        print('%s做饭真好吃'%self.name)
    def money(self):
        print('妈妈有5万')

class Son(Mother,Father): # 哪个在前面先继承哪个类
    def cook(self): # 重写(新建一个新的类与父类方法名一样的时候),重写就不再使用父类的方法
        # pass
        super().cook() # 在使用的重写的时候再去拿父级的方法,重写了的话就使用自己的
        # super().watch()
        Father.cook(self) # 这样写先继承Father类===》可以理解准确性的继承
        print('%s做饭最好吃!!!'%self.name)
    def money(self):
        super().money() # 如果自己的资金不够就把父类的也拿过来
        Father.money(self) # 继承爸爸类
        print('我有一万!!!')

xiaoming=Son('小明',20)

xiaoming.watch()
xiaoming.work()
xiaoming.run()
xiaoming.eat()
xiaoming.cook() # Mother在前面先继承
xiaoming.money()
print(Son.__mro__) # 查询类继承的顺序==  调用方法的时候依次查询

运行截图:

 

二、魔术方法

  思考:字符串拼接的时候,字符串可以直接相加,那我们自定义的类可以实现吗?

例1:

class Rectangle:  # 英 [ˈrektæŋɡl] 长方形、矩形
    def __init__(self,length,width):
        self.length = length
        self.width = width

    def __add__(self,other):  # __add__两个实例相加的时候触发这个魔术方法
        add_length = self.length + other.length
        add_width = self.width + other.width
        return add_length,add_width

    def Area(self):
        areas = self.length * self.width
        return areas

# 实例a,b
a = Rectangle(3,4)
b=Rectangle(5,7)
print(a+b)
print(a.Area())
# 以上非重点内容,以下代码为重点内容

 运行截图:

 例2:str与repr知识点

    1.在交互模式下输出的交互信息与 直接print的信息有些不同, 背后的原理是 ?

    交互式模式使用repr方法

  2.我们该如何使用这种机制 ?

  3.类的实例可以向函数一样被调用吗?

    正常情况下,实例是不能像函数一样被调用的,要想实例能够被调用,就需要定义 __call__  方法

 

class Rectangle:  # 类名后面可以不用括号   #  class Rectangle(object):

    def __str__(self):  # 打印实例名的时候会触发(自己调用)__str__方法

        print(123)
        return '1232'  # 只可以返回字符串,必须要有return

        # return 123  # 错误写法
        # return [123] # 错误写法

    # def __repr__(self):  # 在开发时在调试的时候应用,即交互式模式下
    #
    #     return '1236666'  # 只可以返回字符串,必须要有return
    #     # print(123)  # 错误写法,必须是字符串
    def __call__(self, *args, **kwargs): # 实例名加括号会触发这个方法
        print('123111100000000000')
        return '1231111'

r = Rectangle() # 创建实例化
print(r)  # str方法
print(r.__class__)  # 查看类名
r()  # call方法
print(r())
# print(123)

运行截图:

 例3:常见的魔术方法

class Rectangle:
    '''
    对于类的注释一般写在这里,比如用户注册
    账号:
    密码:
    '''
    name='小明'
    def __init__(self,age):
        self.age=age

r = Rectangle(19) # 创建实例化
print(r.__dict__)  # 查看全部属性,返回属性和属性值键值对形式
print(r.__doc__)  # 查看对象文档,即类中(用三个引号引起来的部分)

print(Rectangle.__bases__) # 查看父级
print(Rectangle.__mro__) #  查看多继承的顺序

运行截图:

 练习题:

    定义正方形类(继承矩形类),实现类的 实例可调用,调用时打印周长;
   同时,直接 打印类实例 时能够打印出实例的面积

class Rectangle:  # 英 [ˈrektæŋɡl] 长方形、矩形
    def __init__(self,length,width):
        self.length = length
        self.width = width

    def Area(self):
        areas = self.length * self.width
        # return areas
        return '该面积为:%s'%areas

# 正方形类
class Square(Rectangle):
    # 因为正方形只需一条边,所以需要重写__init__方法,满足自身需求
    def __init__(self,width):
        self.width=width

    def __call__(self, *args, **kwargs):
       print('周长为:%s'%(self.width*4))

    def __str__(self):

        return '面积为:%s'%(self.width*self.width)

s=Square(5)
s()  # 实例调用触发 Call 方法
print(s)  # 打印实例 ===》触发str方法

运行截图:

与继承、多继承、魔术方法知识点总结相似的内容:

继承、多继承、魔术方法知识点总结

一、继承:简化代码避免重复 继承的意思相当于把父类中可以使用的方法写在自己类中一个性质 例1:创建一个人类,分男人类与女人类 属性:姓名、年龄 方法:吃、走 》公共特征 男:方法==》上班 女:方法==》洗衣服 class People: # 父类,可以理解为一个较为抽象的类,具体细分由下面的子类完

一文搞懂C++继承、多继承、菱形继承、虚继承

继承 目录继承继承继承的访问权限子类赋值给父类赋值兼容规则“天然”的行为验证:1. 其他权限继承能否支持赋值兼容规则2.是否"天然",有没有产生临时变量继承中的作用域继承的构造函数继承的拷贝构造继承的operator=继承的析构函数析构顺序析构的特殊处理继承中的static成员设计一个不能被继承的类

Python 多重继承时metaclass conflict问题解决与原理探究

背景 最近有一个需求需要自定义一个多继承abc.ABC与django.contrib.admin.ModelAdmin两个父类的抽象子类,方便不同模块复用大部分代码,同时强制必须实现所有抽象方法,没想按想当然的写法实现多继承时,居然报错metaclass conflict: In [1]: impo

OOP第二阶段题集总结

一.前言 知识点:考察继承和多态为多,其中还涉及迭代器的使用,在每个题集中都有一个综合性题目设计多方面知识点考试,有List类和HashMap的使用以及正则表达式的运用,并且注重考查设计,理解类与类之间的关系进行合理设计,其中也要遵循我们所学的单一职责,开闭原则,迪米特法则等。 题量:第四次题集和第

Axure 多平台自适应

步骤一:设置自适应视图 1、新建两个页面分别命名为“PC版”和“移动版” 2、启动自适应视图: 条件为大于等于,宽为1024,继承于基本视图3、新建自适应视图“PC版” 4、新建自适应视图“移动版”,条件为小于等于,宽为1024,继承于基本视图 步骤二:拖拉摆放好相关控件 1、进入“PC版”视图,,

manim边学边做--MathTex

上一篇介绍的SingleStringMathTex主要用来显示只有一行的数学公式,对于复杂的数学公式,可以使用MathTex类。 MathTex类继承自SingleStringMathTex,在其基础之上增加了更多的功能。其实,MathTex是制作数学动画时常用的类,反而SingleStringMa

设计模式-C#实现简单工厂模式

前言 上一篇文章写了如何使用RabbitMQ做个简单的发送邮件项目,然后评论也是比较多,也是准备去学习一下如何确保RabbitMQ的消息可靠性,但是由于时间原因,先来说说设计模式中的简单工厂模式吧! 在了解简单工厂模式之前,我们要知道C#是一款面向对象的高级程序语言。它有3大特性,封装、继承、多态。

Flask API 如何接入 i18n 实现国际化多语言

​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言。 用户请求 API 的多语言化其实有两种解决方案: 后端返回:"USER_ERROR" => 前端渲染:"用户错误" 后端接收请求中 "Ac

client-go实战之六:时隔两年,刷新版本继续实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 时隔两年,《client-go实战》被激活,更多内容将会继续更新 时间过得真快,《client-go实战》系列已是两年前的作品,近期工作中再次用到clie

BigCodeBench: 继 HumanEval 之后的新一代代码生成测试基准

HumanEval 是一个用于评估大型语言模型 (LLM) 在代码生成任务中的参考基准,因为它使得对紧凑的函数级代码片段的评估变得容易。然而,关于其在评估 LLM 编程能力方面的有效性越来越多的担忧,主要问题是HumanEval 中的任务太简单,可能不能代表真实世界的编程任务。相比于 HumanEv