首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python的super()的作用和原理

本文链接:https://blog.csdn.net/bbwangj/article/details/100972709 Python对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的...this,比如:C#),用于传递对象本身,而在调用的时候则不 传递,系统会自动传递。...Hello, Python....当存在继承关系的时候,有时候需要在子类调用父类的方法,此时最简单的方法是把对象调用转换成类调用,需要注意的是这时self参数需要传递,例如: class FooParent: def bar...Hello, Python. 这样做一些缺点,比如说如果修改了父类名称,那么在子类中会涉及多处修改,另外,Python是允许多继承的语言,如上所示的方法在多继承时就需要重复写多次,显得累赘。

83120

使用Python类的构造函数和析构函数

在上面的代码示例,Person类具有一个构造函数__init__和一个析构函数__del__。...问题是,如果我在程序地删除Person类的实例,析构函数__del__是否会被自动调用,或者我是否要在“main”程序/类添加一些东西,如上面的代码示例所示?...您可以从gc.garbage获取被忽略的对象列表。您有时可以使用弱引用来完全避免循环。del__函数可以作弊,保存对对象的引用,并停止垃圾回收。在__del__引发的异常会被忽略。...del__在Python并不是一个“受宠”的孩子。您会注意到sys.exit()文档没有指定在退出之前是否收集垃圾,并且有很多奇特的问题。...对全局变量调用__del__会导致奇怪的排序问题,例如http://bugs.python.org/issue5099。即使__init__失败,是否也应该调用__del?

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

怎么理解Python的super函数

前言 在Python类的继承,经常能看到super函数的存在,那super函数主要的作用,以及如何理解和使用好这个函数?本次教程将详细讲解,希望大家看到最后,并按照代码实际操作下。..., 97) print(stu_1.score) parent child 97 通过代码我们可以看出,super函数常常用于子类的构造函数,用于调用父类(超类)的构造函数,并且不会引用基类。...之所以说不用引用基类,是因为通过调用父类方法也能实现功能。...__init__() #python2写法 super()....super函数和直接调用父类方法的区别 在单继承时,我们看到super和直接调用父类方法得到的结果是一样的,只是不会引用基类。但多重继承就不要了,我把上面的代码进行了修改,我相信你能看懂区别。

81830

Selenium系列(六) - 详细解读强制等待、隐等待、等待的区别和源码解读

Javascript开发的;每次加载一个网页,就会加载各种HTML标签、JS文件 但是,加载肯定有加载顺序,大型网站很难说一秒内就把所有东西加载出来,不仅如此,加载速度也受网络波动影响 因此,当我们要在网页做元素定位的时候...强制等待3秒才执行下一步=== sleep(3) # 找到搜索框 inputElement = driver.find_element_by_id("kw") WebDriver提供了两种类型的等待:等待和隐等待...什么是等待?...需要定位某个元素的时候,但元素可能不可见,这个时候针对这个元素就可以使用等待了 等待和隐等待最大的不同就是:你可以它看成是局部变量,作用于指定元素 等待的优势 相比隐等待,等待只对指定元素生效...节省加载时间】 等待的代码 #!

4K51

PYTHON 的__init__()方

__init__: 在Python ,__init__()实际上不是一个构造器。你没有调用“new”来创建一个新对象。(Python 根本就没有“new”关键字)。...取而代之,Python 创建实例后,在实例化过程调用__init__()方法,当一个类被实例化时,就可以定义额外的行为,比如,设定初始值或者运行一些初步诊断代码 ———主要是在实例被创建后,实例化调用返回这个实例之前...你可以认为实例化是对__init__()的一种隐调用,因为传给Sample()的参数完全与__init__()接收到的参数是一样的(除了self,它是自动传递的)。...一旦对象创建了,Python 检查是否实现了 __init__()方法。...然而,如果子类重写基类的构造器,基类的构造器就不会被自动调用了--这样,基类 的构造器就必须写出才会被执行,像我们上面那样,用AddrBookEntry.__init__()设置名字和电话号码。

52510

Python入门(16)

这里我们就能看见 self 的存在了,请注意, 调用say_hi() 这一方法原本并不需要参数,但是我们还是要在方法的定义中提供 self 参数。...(2)、MyClass 类的实例调用了say_hi()方法,但是,并没有调用__init__() 方法,然而它已经运行了。这正是这个方法的特殊之处。...(3)、如果子类定义了__init__ 方法,将优先被调用,如果此时需要调用基类的__init__ 方法,则需要地进行调用。...比如,我们在 Teacher 和 Student 子类定义了 __init__ 方法, Python 就不会自动调用基类 SchoolMember 的构造函数,必须自己调用它。...相反,如果我们没有在子类定义 __init__ 方法,Python 将会自动调用基类的该方法。 (4)、修改父类的任何功能,它将自动反映在子类。相反,子类的修改,则不会影响到其他的子类。

83510

Python 的 __.call()__ 方法:创建可调用实例

注意: 因为 dir() 检查给定对象是否 .__call__() 方法,可以用它来检查该对象是否调用。...上例的 .__call__() 方法不带任何参数。该方法也不返回值。然而,在自定义类如何编写 .__call__() 方法没有限制。...有些类一个的实现,有些类从父类继承这个方法。在许多情况下,object 是提供这个方法的类: >>> dir(object) [ ......因此,即使不在自定义类定义一个的 .__init__() 方法,该类仍然会继承 object 的默认实现。 与此相反,....__init__() 和 __.call()__ 的区别 实现使用可调用实例解决实际问题的各种示例 了这些知识,我们就可以在 Python 代码设计和实现可调用实例。

29520

python 实现多继承

好了,现在是深入研究Python的方法解析顺序(MRO)的时候了,看看发生了什么 当访问类的方法或属性时,Python使用类MRO来查找它。super()还使用MRO来确定调用哪个方法或属性。...您需要在TemporarySecretary覆盖.calculate_payroll()并从中调用正确的实现 class TemporarySecretary(Secretary, HourlyEmployee...您可以再次运行该程序以查看其是否正常运行 $ python program.py Tracking Employee Productivity ============================...Jane Doe - Check amount: 600 Payroll for: 5 - Robin Williams - Check amount: 360 程序现在可以正常工作了,因为您可以通过地告诉解释器我们想要使用哪个方法来强制方法解析顺序...您仍然使用多重继承来继承salary策略类和productivity角色的实现,但是每个类的实现只需要处理初始化 注意,您仍然需要在构造函数地初始化薪水策略。

64610

Python3快速入门(六)——Pyth

2、派生类构造函数 派生类的构造函数需要调用父类的构造函数,对父类的属性成员进行初始化,调用父类的构造函数时需要传递实例对象self。...子类需要在自己的__init__方法的第一行位置调用父类的构造方法,上述代码给出了两种方法: super(子类名, self).__init__(父类构造参数),如super....Python虽然支持多继承,但Python对多继承的支持的也是有限的。 多继承时,使用super只会调用第一个父类的属性方法,因此,要想调用特定父类的构造器只能调用父类名.__init__。...如果父类中有相同的方法名,而在子类使用时未指定调用的具体赋类的方法,Python会根据继承顺序从左至右搜索查找父类是否包含方法。...在Python 3.x无论是否指定继承object,所有的类都是新式类,在多继承的情况下,经典类查找父类属性或方法的顺序是深度优先,新式类查找父类属性的顺序是广度优先。

1.3K20

开源图书《Python完全自学教程》8.4方法

,如果函数参数,必须很明确地(或者说是“地”)给每个参数提供对象或引用——一个参数也不能少。...根据8.3.3节可知,第一个参数 self 总引用类的实例,且通过实例调用方法的时候,不需要地为它传入实参。...此外,对于类的方法,也可以通过类名称调用: >>> Foo.my_method(f, 9) # (1) 81 此时,必须要地为 self 提供实例参数。...在简单的程序,我们能够很容易判断实例是否已经 msg 属性,但在复杂情况下,不能明确地控制实例属性时,在注释(3)的语句中使用 self.msg 就会有较大风险(比如实例与 msg 同名的属性,但其值不是注释...那么在注释(9)调用这个方法的时候,不再地在参数列表传入类对象,Person.by_birth() 就表示类 Person 作为第一个参数传给了 cls 。

27110

【愚公系列】2021年12月 Python教学课程 20-面向对象编程-类和对象

但在Python3 ,即使没有继承任何父类的定义了一个类,它也默认继承 object 类。因为,object 是 Python3 中所有类的基类。...任何一个类,名字为__init__的方法就是类的实例化方法,具有__init__方法的类在实例化的时候,会自动调用该方法,并传递对应的参数。...需要注意: 创建对象时,__init__方法会立刻被默认调用,不需要手动调用 __init__方法的第一个参数永远是 self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到...self,因为 self 就指向创建的实例本身 了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但 self不需要传,Python 解释器自己会把实例变量传进去...Student 类__init__方法里的 name 和 age 就是两个实例变量。通过实例名加圆点的方式调用实例变量。

24330

Python入门到放弃 | 超简单 跟我学(十)

这里我们地指出使用哪个变量,因此没有任何冲突。...我们没有调用 __init__ 这个方法,这是这个方法特殊之处。 正如 say_hi 方法所示的,现在我们在我们的方法之中可以使用 self.name 这个域了。...之后我们可以看到在 __init__ 方法,通过 self 变量调用了父类的 __init__ 方法来初始化子类对象属于父类的部分。...这非常重要,请记住 – 既然我们在 Teacher 和 Student 子类定义了 __init__ 方法,Python 不会自动的调用父类 SchoolMember 的构造方法,你必须调用。...相反的,如果我们不定义子类的 __init__ 方法,Python 将会自动地调用父类的构造方法。

19310

Python(五)

p = Person() p.say_hi() __init__ 方法 在 Python 的类不少方法的名称具有着特殊的意义。...然后,我们会注意到基类的 __init__ 方法是通过 self 变量被调用的,因此我们可以初始化对象的基类部分。Python 不会自动调用基类的构造函数,你必须自己调用它。...相反,如果我们没有在一个子类定义一个 __init__ 方法,Python 将会自动调用基类的构造函数。...上例,我们发现被调用的是子类型的 tell 方法,而不是 SchoolMember 的 tell 方法。理解这一问题的一种思路是 Python 总会从当前的实际类型开始寻找方法,也就是多态。...在 Python ,如果你调用 len() 函数试图获取一个对象的长度,实际上,在 len() 函数内部,它自动去调用该对象的 __len__() 方法: len('ABC') # 3 'ABC'.

42720

Python编程思想(27):类的继承

如果在定义一个 Python类时并未指定这个类的直接父类,则这个类默认继承 object类。因此,object类是所有类的父类,要么是其直接父类,要么是其间接父类。...使用未绑定方法调用被重写的方法 如果在子类调用重写之后的方法,Python总是会执行子类重写的方法,不会执行父类中被重写的方法。如果需要在子类调用父类中被重写的实例方法,那该怎么办呢?...区别在于,在通过类名调用实例方法时,Python不会为实例方法的第1个参数self自动绑定参数值,而是需要程序绑定第一个参数self。...后面的代码通过调用 Base_Class 的name方法,并为第1个参数self绑定参数值,这就实现了调用父类中被重写的方法。 5....通过这种方式,Manager类重写了父类的构造方法,并在构造方法调用了父类的两个构造方法执行初始化,这样两个父类的实例变量都能被初始化。

1.3K10

Java开发者的Python快速进修指南:面向对象

在Java,this关键字是隐的,用于指代当前对象的实例,而在Python,self必须声明并作为方法的第一个参数传递。...,self关键字需要地在方法定义中指出,但其实它的作用与Java的this关键字相似,代表着方法所属的对象实例。...在调用实例方法时,Python会自动将对象实例作为第一个参数传递给self,因此在正常使用实例方法时,我们无需地传递这个参数。...在Java,我们经常需要地使用super来调用父类的构造器,而在Python,这一步骤是可选的。如果没有指定,Python会自动调用父类的构造器,这让代码看起来更加简洁。...print(dog.name) # 输出: Buddy 不声明__init__默认使用super调用父类的构造器,如果你一旦声明了__init__那么记得调用super,否则将无效 在Python

35940

Python - 面向对象编程 - __init__() 构造方法

什么是构造方法 在创建类时, 可手动添加一个 方法,称为构造方法,这是一个实例方法 __init__() 构造方法用于创建实例对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调用它...__() 构造方法并不是写 假设不写,Python 也会自动添加一个仅包含 self 参数的 __init__() 构造方法,这又称为类的默认构造方法 不带参数的构造方法栗子 # 不带参数 class...PoloBlog: def __init__(self): print("自动调用构造方法") # 定义了一个实例属性 self.name =..."小菠萝" blog = PoloBlog() print(blog.name) # 输出结果 自动调用构造方法 小菠萝 显然,在创建 blog 这个对象时,隐调用了手动创建的 __init_..._() 构造方法 带参数的构造方法栗子 # 带参数 class PoloBlog: def __init__(self, name, age): print("自动调用构造方法"

30830

说说Python的__new__和__init__的区别?

废话不多说,开始今天的题目: 问:说说Python的__new__和__init__的区别? 答:在Python__new__和__init__具有不同的功能。...(object): # explicitly inherits from 'object' pass 在Python3所有的类均默认继承object,所以并不需要地指定object为基类...Python旧类的__new__和__init__ Python的旧类实际上并没有__new__方法。因为旧类的__init__实际上起构造器的作用。...实际上,除非调用:oldStyleClass.__new__(oldStyleClass),该类的__new__方法的内容永远不会被调用。因为旧类构造实例并不会调用__new__方法。...Python新类的__new__和__init__ Python的新类允许用户重载__new__和__init__方法,且这两个方法具有不同的作用。__new__作为构造器,起创建一个类实例的作用。

67530
领券