首页
学习
活动
专区
圈层
工具
发布

python 多重类继承__init__

目的 项目中遇到多重类继承的问题,想调用父类构造函数中的内容,调试了一两个小时,遇到两个问题。...调用父类方法 想在子类中调用父类的某个已经被覆盖的方法: 解决方案 为了调用父类(超类)的一个方法,可以使用 super() 函数,比如 class A: def spam(self):...__init__() self.y = 1 super() 的另外一个常见用法出现在覆盖Python特殊方法的代码中,比如: class Proxy: def __init__(...__init__() 注意,这里的 self 也是当前 C 的实例,MRO 列表跟上面是一样的,搜索 A 在 MRO 中的下一个类,发现是 B,于是,跳到了 B 的 __init__,这时会打印出 enter...总结 事实上,super 和父类没有实质性的关联; super(cls, inst) 获得的是 cls 在 inst 的 MRO 列表中的下一个类; 在使用多重继承时候,注意继承顺序; 如果使用到父类的构造函数

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系1.单继承时super()和__init__()实现的功能是类似的class Base(object): def __init__(self...把基类改为旧式类,即不继承任何基类class Base(): def __init__(self): print 'Base create'#执行时,在初始化b时就会报错 super...-------------------------------3. super不是父类,而是继承顺序的下一个类在多重继承时会涉及继承顺序,super()相当于返回继承顺序的下一个类,而不是父类,类似于这样的功能...在多重继承里,如果把childA()中的 super(childA, self).__init__() 换成Base....,如果是本身就会依次继承下一个类;如果是继承链里之前的类便会无限递归下去;如果是继承链里之后的类便会忽略继承链汇总本身和传入类之间的类;比如将childA()中的super改为:super(childC

    91310

    PYTHON 中的__init__()方

    在类定义时,self和__init__会时常用到。 self 参数,它在所有的方法声明中都存在。...__init__: 在Python 中,__init__()实际上不是一个构造器。你没有调用“new”来创建一个新对象。(Python 根本就没有“new”关键字)。...取而代之,Python 创建实例后,在实例化过程中,调用__init__()方法,当一个类被实例化时,就可以定义额外的行为,比如,设定初始值或者运行一些初步诊断代码 ———主要是在实例被创建后,实例化调用返回这个实例之前...默认情况下,如果没有定义(或覆盖)特殊方法__init__(),对实例不会施加任 何特别的操作.任何所需的特定操作,都需要程序员实现__init__(),覆盖它的默认行为。...__init__()设置名字和电话号码。我们的子类在构造器后面几 行还设置了另外两个实例属性:员工ID 和E-mail 地址。 核心笔记:命名类、属性和方法 类名通常由大写字母打头。

    71210

    python类中super()和__init__()的区别

    目录[-] 单继承时super()和init()实现的功能是类似的 class Base(object): def __init__(self): print 'Base create...super()只能用于新式类中 把基类改为旧式类,即不继承任何基类 class Base(): def __init__(self): print 'Base create' 执行时...__init__() TypeError: must be type, not classobj super不是父类,而是继承顺序的下一个类 在多重继承时会涉及继承顺序,super()相当于返回继承顺序的下一个类...在多重继承里,如果把childA()中的 super(childA, self)._init_() 换成Base...., 如果是本身就会依次继承下一个类; 如果是继承链里之前的类便会无限递归下去; 如果是继承链里之后的类便会忽略继承链汇总本身和传入类之间的类; 比如将childA()中的super改为:super(childC

    1.1K60

    Python中类的继承、多层继承和多继承

    Python中,一个类可以通过继承的方式来获得父类中的非私有属性和非私有方法。...一、继承、重写、和调用重写的父类方法 继承的语法为在类名后的小括号()中写入要继承的父类名,如果要继承多个类则中间用逗号分隔。...当子类实现一个和父类同名的方法时,叫做重写父类方法。直接在子类中定义与父类同名的方法,然后在方法中实现子类的业务逻辑,子类方法就会覆盖父类的同名方法。...4.如果在子类重写父类的方法中,需要使用父类同名方法中的功能,在父类功能基础上做扩展,则子类可以在重写的方法中调用父类被重写的方法,使用super()来调用。 ? 二、类的多层继承 类可以多层继承。...当Mi类对象调用属性和方法时,优先在自己的内部查找是否有该属性和方法,如果没有会到它的父类Phone中查找该属性和方法,如果没有会继续往上在Phone的父类Electrical中查找,一直查找到object

    6K30

    Python面向对象编程-三大特性-继承-覆盖和重写

    覆盖和重写子类可以覆盖(override)或重写(overwrite)父类的方法或属性。覆盖是指在子类中定义与父类相同名称的方法或属性,这样子类的实例调用该方法或属性时就会使用子类的定义。...下面是一个简单的例子,演示了如何覆盖和重写父类的方法:class Animal: def __init__(self, name): self.name = name def...在 Cat 类中,我们覆盖了父类的 speak() 方法,而在 Lion 类中,我们重写了父类的 speak() 方法,并添加了一个新的方法 hunt()。...在创建 Cat 和 Lion 对象后,我们分别调用它们的方法和属性,看看输出结果。...可以看到,Cat 对象调用的是子类的方法,而父类的属性被正确地继承了下来;Lion 对象调用的是子类的方法和属性,还调用了新增的方法 hunt()。

    42440

    详解Python中的__init__和__new__的区别

    使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候。例如: ? 这样便是__init__最普通的用法了。...__new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。 ? 执行结果: ?...然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self 所以,__init__ 和 __new__ 最主要的区别在于: 1....三、__new__ 的作用 依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。...其实我最早接触__new__的时候,就是因为需要自定义 metaclass,但鉴于篇幅原因,我们下次再来讲python中的metaclass和__new__的关系。

    2.1K10

    Python中 __init__的通俗解释

    前言 作为典型的面向对象的语言,Python中 类 的定义和使用是不可或缺的一部分知识。对于有面向对象的经验、对类和实例的概念已经足够清晰的人,学习Python的这套定义规则不过是语法的迁移。...一个自然的解决方案是允许我们在执行实例化过程Student()时传入一些参数,以方便且正确地初始化/设置一些属性值,那么如何定义这种初始化行为呢?答案就是在类内部定义一个__init__函数。...所以__init__函数的参数列表会在开头多出一项,它永远指代新建的那个实例对象,Python语法要求这个参数必须要有,而名称随意,习惯上就命为self。...新建的实例传给self后,就可以在__init__函数内创建并初始化它的属性了,比如之前的scores,就可以写为 ?...从第二参数开始均可设置变长参数、默认值等,相应地将允许实例化过程Student()中灵活地传入需要数量的参数; 其他…… 说到最后,__init__还是有个特殊之处,那就是它不允许有返回值。

    1.2K20

    Python类中的__new__和__init__的区别

    在写Python类时,或者看某些项目源码时,总是见到__init__和__new__方法,一直没有深入研究两者的区别,今天聊聊这个。 __new__ __new__是类(class)方法。...通常,__new__除非您要继承不可变类型(如str,int,unicode或tuple),否则不必重写。...针对__new__的用法,举个栗子: 依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径...__init__ __init__是实例方法。 class调用__init__时,是对这个class生成的新实例初始化,初始化的内容,就是__init__内定义的内容。...__init__不返回任何东西。创建实例后,它仅负责初始化实例,且仅在需要初始化某些内容时,才会进行调用。

    86350

    说说Python中的__new__和__init__的区别?

    如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。 废话不多说,开始今天的题目: 问:说说Python中的__new__和__init__的区别?...答:在Python中__new__和__init__具有不同的功能。并且对于Python的新类和旧类而言功能也不同。...旧类是Python3之前的类,旧类并不是默认继承object类,而是继承type类。...(object): # explicitly inherits from 'object' pass 在Python3中所有的类均默认继承object,所以并不需要显式地指定object为基类...Python旧类中的__new__和__init__ Python的旧类中实际上并没有__new__方法。因为旧类中的__init__实际上起构造器的作用。

    84730

    在__init__中设置对象的父类

    1、问题背景在Python中,可以为对象设置一个父类,从而实现继承。但是,如果想要在实例化对象时动态地指定父类,则会出现问题。...= Circle(parent=Red)blue_circle = Circle(parent=Blue)blue_square = Square(parent=Blue)但是,这段代码会报错,因为在Python...在类工厂中,可以根据传入的参数来决定创建哪个类。...如果parent是Blue,则创建两个类,Circle和Square,它们的父类都是Blue。最后,它返回创建的类。这样,我们就可以在实例化对象时动态地指定对象的父类了。第二个解决方案是使用依赖注入。...依赖注入是一种设计模式,它可以将对象的依赖关系从对象本身中解耦出来。这样,就可以在实例化对象时动态地注入它的依赖关系。

    1.3K10

    Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    测试环境: win7 64位 Python版本:Python 3.3.5 代码实践: 1、在子类中通过“类名”调用父类的方法 class FatherA: def __init__(self)...__init__() # 在子类中调用父类的方法:super().方法名称(参数) if __name__ == '__main__': b = SubClassB() class FatherA...__init__() # 在子类中调用父类的方法:super(type, obj).方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果...__init__(self) # 在子类中调用父类的方法:super(type, type).方法名称(参数) if __name__ == '__main__': b = SubClassC()...,以super().method(参数)方法调用父类的方法,如果不同父类中存在同名方法method(不管参数列表是否相同),则按继承顺序,选择第一个父类中的方法。

    3.8K30

    盘点Python中的继承和多态

    今天给大家分享Python基础之继承和多态。 一、继承的介绍 继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。继承的特点就是子类可以使用父类的属性(特征、技能)。...继承是类与类之间的关系。 继承可以减少代码冗余、提高重用性。 在现实生活中,继承一般指的是子女继承父辈的财产,如下图: 二、如何用继承?...继承的特点 在继承中基类的构造函数(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。...想一想: 如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?...,主要介绍了Python基础中继承和多态,包括单继承、多继承的语法、多态常见的 “鸭子类型”、 以及如何重写父类的方法都做了详细的讲解。

    1.2K10

    盘点Python中的继承和多态

    今天给大家分享Python基础之继承和多态。 一、继承的介绍 继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。继承的特点就是子类可以使用父类的属性(特征、技能)。...继承是类与类之间的关系。 继承可以减少代码冗余、提高重用性。 在现实生活中,继承一般指的是子女继承父辈的财产,如下图: 二、如何用继承?...继承的特点 在继承中基类的构造函数(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。...想一想: 如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?...,主要介绍了Python基础中继承和多态,包括单继承、多继承的语法、多态常见的 “鸭子类型”、 以及如何重写父类的方法都做了详细的讲解。

    79020

    Python中 __init__的通俗解释是什么?

    Python是一门面向对象的编程语言,面向对象是一种代码封装的技术,包含了各种功能,让代码能重复利用、高效节能。...、init函数(方法)的第一个参数必须是 self(self为习惯用法,也可以用别的名字),后续参数则可 以自由指定,和定义函数没有任何区别。...self.name = "小明" test = Sample() print(test.name) # 输出结果 自动调用构造方法 小明 如上,在创建 test这个对象时,隐式调用了手动创建的__...init__()构造方法 构造函数__init__为什么会存在?...所以综上,构造方法__init__用于创建实例对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调用它,用来初始化对象的某些属性。

    74330

    Python中的继承

    python3x版本中只有一种类: python3中使⽤的都是新式类. 如果基类谁都不继承....父类的方法实现 和 子类的方法实现,完全不同 就可以使用 覆盖 的方式,在子类中 重新编写 父类的方法实现 具体的实现方式,就相当于在 子类中 定义了一个 和父类同名的方法并且实现 重写之后,在运行时,...在⾯向对象思想中. 是把⼀些看似⽆关紧要的内容组合到⼀起统⼀进⾏存储和使⽤. 这就是封装. 继承: ⼦类可以⾃动拥有⽗类中除了私有属性外的其他所有内容. 说⽩了, ⼉⼦可以随便⽤爹的东⻄....顺序不能乱, 在python中实现继承非常 简单. 在声明类的时候, 在类名后⾯添加⼀个⼩括号,就可以完成继承关系. 那么什么情况可以使⽤继 承呢? 单纯的从代码层⾯上来看....这个在python中其实是很不容易说明⽩的. 因为我们⼀直在⽤. 只是没 有具体的说. 比如. 我们创建⼀个变量a = 10 , 我们知道此时a是整数类型.

    88930
    领券