首页 > 编程语言 >Python面向对象之派生

Python面向对象之派生

时间:2024-01-12 21:38:07浏览次数:22  
标签:__ run 派生 Python self 面向对象 super class def

派生

【一】概要

  • "派生"(Derivation)是指在面向对象编程中,通过创建新的类,基于已有的类(通常称为父类或基类)来构建新的类,以获取和扩展父类的属性和方法。在这个过程中,新创建的类称为子类或派生类。
  • 通俗来讲,派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法

【二】常用方法

【1】指名道姓

class 父类():
    def __init__(self,参数1,参数2):
        self.参数1 = 参数1
        self.参数2 = 参数2
        
class 派生类(父类):
    '''此处派生是为了,继承父类的初始化属性,并初始化自己的属性'''
    def __init__(self,参数1,参数2,派生类自己的参数):
        # 不依赖于继承,不是父类也可以重写
        父类.__init__(self,参数1,参数2)
        # 需要将self传入

【2】super()

class 父类():
    def __init__(self,参数1,参数2):
        self.参数1 = 参数1
        self.参数2 = 参数2
        
class 派生类(父类):
    '''此处派生是为了,继承父类的初始化属性,并初始化自己的属性'''
    def __init__(self,参数1,参数2,派生类自己的参数):
        # 依赖于继承
        # 使用super方法就可以默认向上查找父类中的属性并重写
        super().__init__(参数1,参数2)
        # 不需要传递self

【三】详解

【1】指名道姓

class Father(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
        self.father_run =self.run

    def run(self):
        print(f"Father.run")

class Son(Father):
    def __init__(self,name,age,level):
        '''指名道姓的声明'''
        Father.__init__(self,name,age)
        self.level = level
    def run(self):
        # 方法可能不太明显,因为可以解释为调用
        Father.run(self)
        print(f"Son.run")

s = Son('son',5,'son')
print(s.__dict__)   # {'name': 'son', 'age': 5, 'run': <bound method Son.run of <__main__.Son object at 0x00000152873E3FA0>>, 'level': 'son'}
s.run()   # 将会输出两条,而不是一条
# Father.run
# Son.run

【2】super()

class Father(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
        self.father_run =self.run

    def run(self):
        print(f"Father.run")

class Son(Father):
    def __init__(self,name,age,level):
        super().__init__(name,age)
        self.level = level
    def run(self):
        # super会更直观一些
        super().run()
        print(f"Son.run")

s = Son('son',5,'son')
print(s.__dict__)   # {'name': 'son', 'age': 5, 'run': <bound method Son.run of <__main__.Son object at 0x00000152873E3FA0>>, 'level': 'son'}
s.run()   # 将会输出两条,而不是一条
# Father.run
# Son.run

class A:
    def run(self):
        super().run()
        print("A.run")
        
class B:
    def run(self):
        print("B.run")
        
class C(A,B):
    pass

c = C()
c.run()
# B.run
# A.run

【3】super()mro()

  • super() 用于以一种一致而可预测的方式调用父类的方法,它遵循方法解析顺序(MRO)以确定应该查找哪个类的方法。
'''引:c.test() 的结果是什么?报错还是输出内容'''
class A:
    def test(self):
        # super是向上继承,而A是新式类,默认继承object
        super().test()


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


class C(A, B):
    pass

c = C()
c.test()
class A:
    def test(self):
        super().test()


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


class C(A, B):
    pass

c = C()
c.test()   # from B

# super() MRO以确定应该查找哪个类的方法。
# mro() 可以用来查看属性查找顺序
print(C.mro())
# [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
  • C 的 MRO 是由类定义中基类的顺序确定的。在这种情况下是 C(A, B),所以 MRO 是 [C, A, B]。当你调用 c.test() 时,它会在 MRO 列表中的第一个类中(C)查找 test 方法,如果找不到,它会移到下一个类(A),以此类推。
  • 因此,在类 Atest 方法中,当你使用 super().test() 时,它会在 MRO 中的下一个类中查找 test 方法,也就是 B。这样,它确保了方法是从 MRO 中的下一个类中调用的,提供了一种一致而可预测的导航类层次结构的方式。

标签:__,run,派生,Python,self,面向对象,super,class,def
From: https://www.cnblogs.com/Lea4ning/p/17961620

相关文章

  • 面向对象的三大特性及派生和组合
    面向对象的三大特性面向对象编程有三大特性:封装、继承、多态-->派生和组合【一】封装【1】什么是封装在程序设计中,封装(Encapsulation)是对具体对象的一种抽象封装就是对具体对象的一种抽象简单理解就是将不想让别人看到的东西全部藏起来【2】为什么要封装封装数......
  • Python六个标准的数据类型
    Python3中有六个标准的数据类型,分别是:数字、字符串、列表、元组、集合、字典。1、Number(数字)Python中的数字有四种类型:整数、布尔型、浮点数和复数。int(整数),例如1、2、3。bool(布尔型),包括True和False两个值,分别代表真和假。举个例子:张三是不是男生?答案要么是真,要么是假。你只......
  • [oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算
    和python玩耍......
  • python中进度条组件tqdm使用
    有的时候我们需要记录相关的执行过程,在整个过程中如果使用到了进度条,就更直观看到运行的现状。比如一下代码:importtimeif__name__=="__main__":#dosomething,进度为30time.sleep(1)print("执行了30%")#doanotherthing,进度为20time.slee......
  • Python使用Matplotlib包绘制x方的积分函数图像
    Matplotlib是一个常用的Python绘图库,可以用于创建各种类型的图表和可视化。本文将介绍如何使用Matplotlib包在Python中绘制x方的积分函数图像。步骤:以下是使用Matplotlib包绘制x方的积分函数图像的步骤:1.导入所需的库。2.定义要绘制的函数。3.创建一个表示x轴范围的数组。4.计算函......
  • Python中有哪些常用的工具可以用于接口自动化
    接口自动化测试是测试的重要一部分,Python作为一种流行的编程语言,提供了许多用于接口自动化测试的工具。本文将介绍一些常用的Python工具,用于接口自动化测试。1.RequestsRequests是一个Python库,用于发送HTTP请求和处理响应。它提供了一种简单而优雅的方式来发送HTTP/1.1请求,并自动处......
  • Python模块安装的前提条件及步骤详解
    Python是一种功能强大的编程语言,拥有丰富的第三方模块库。在使用这些模块之前,我们需要满足一些前提条件才能进行安装。本文将介绍Python模块安装的前提条件以及详细的安装步骤。前提条件:在安装Python模块之前,需要满足以下前提条件:1.Python解释器:确保已经正确安装了Python解释器,并且......
  • Python多线程的限制与使用场景探讨
     Python是一种流行的编程语言,具有内置的多线程支持。然而,由于Python的全局解释器锁(GIL)机制等因素的存在,有人认为Python的多线程在某些情况下可能没有明显的性能优势。本文将探讨Python多线程的限制以及适用的使用场景。 1.GIL对多线程的影响 全局解释器锁(GIL)是Python解释器的......
  • python-函数进阶:函数返回多个返回值,lambda匿名函数
    如果一个函数要有多个返回值,要怎么书写呢?deftest_return():return1,2x,y= test_return()按照返回值的顺序,写对应顺序的多个变量接收即可变量之间用逗号隔开支持不同数据类型的return  匿名函数匿名函数使用lambda关键字进行定义定义语法:lambda传入参数:函数......
  • python第三节:Str字符串类型(4)
    str.islower()判断是否都是小写字符。字符串不必都是小写字母,但是至少要有一个可以判断大小写的字符。例子:str1='abc'str2='aBcd'str3='字符a'str4='12'str5='df43'str6='字符Bcd'print(str1.islower())print(str2.islower())......