上节《第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解》通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述代码中__new__方法调用父类的__new__方法时,传递参数只传递了cls一个实参,而没有传递后面两类参数(在本例中只有第一类参数中有1个实参10)。这个问题也困扰了老猿,我们先验证一下,如果传递全部参数会怎样。

一、 案例1:调用object类的__new__传参验证

  1. 我们将上节的类中的__new__方法改成传递全部参数后,类定义如下:
class Cir():
def __new__(cls,*args,**kwargs):
print("Python传递给__new__的参数:\n***cls: ",cls,"\n***args: ",args,"\n***kwargs:",kwargs)
inst = super().__new__(cls,*args,**kwargs) #将所有参数都传递进去
print("__new__返回值:",inst)
return inst def __init__(self,radius):
print("In init,self的值为:",self,", radius的值为:",radius)
self.radius = radius
  1. 定义实例变量:
cir=Cir(10)
执行结果报错:TypeError: object.__new__() takes no arguments
  1. 完整执行截屏如下:
  2. 案例分析:

    本案例定义的类没有自定义父类,因此其父类就是object,调用super().__new__方法执行的就是object类的__new__方法。结合上节正常执行执行的情况说明,不能传递所有参数,只能传递类名给object. __new__方法才能通过Python检查。
  1. 我们来看看Python的相关帮助文档
执行help(object.__new__),输出内容:
Help on built-in function __new__: __new__(*args, **kwargs) method of builtins.type instance
Create and return a new object. See help(type) for accurate signature.

截图如下:



从上面没有看出object. __new__只能传入一个参数。

  1. 我们再到Python3.73文档中查一下:

    中文版:

英文版:



从上面也说明是可以传多个值的。所以老猿没有明白这个地方实际使用时为什么不能传递多个值,如果哪位大拿研究清楚了欢迎给老猿指导。

二、 案例2:调用自定义父类的__new__传参验证

  1. 案例说明

    定义两个类,Vehicle类和Car类,Car是从Vehicle派生的,Car重写了__new__方法,验证几种情况:
  1. Vehicle类没有重写__ new__方法;
  2. Vehicle类重写__ new__方法,只传入cls;
  3. Vehicle类重写__ new__方法,传入所有参数。
  1. 案例代码:
  1. Vehicle类没有重写__ new__方法,Car重写该方法并调用父类传递所有参数,执行截屏如下:



    说明还是不行,老猿认为这是因为Vehicle没有重写__ new__方法,就会调用其直接父类object的__ new__方法,导致不行。
  2. Vehicle类和Car类都重写__ new__方法,Car类调用父类的该方法时传递所有参数,而Vehicle类调用父类的该方法时只传cls参数,执行截屏如下:



    可以看到执行成功。
  3. 还有一种情况,就是Vehicle类调用父类的该方法时传递所有参数,结果还是报错,在此就不提供截图了

三、 结论

通过以上案例验证,可以确认:

  1. 调用object. __ new__方法时,只能穿cls参数,否则会报错;
  2. 调用自定义类的自定义父类__ new__方法,可以传所有参数,要看父类的__ new__方法定义的参数是怎么定义的。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑的更多相关文章

  1. 第8.4节 Python类中不是构造方法却胜似构造方法的__new方法__深入剖析:语法释义

    一.    引言 在本博前面的内容都对构造方法__init__进行了介绍,也在前面章节引入了__new__方法,但老猿认为__new__方法比构造方法__init__更应该属于构造方法.这是因为在Py ...

  2. 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...

  3. 第7.14节 Python类中的实例方法详析

    第7.14节 Python类中的实例方法详析 一.    实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1.    类体中定义实例方法 第一种方式很简单,就是在类体 ...

  4. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  5. 第8.9节 Python类中内置的查看直接父类的__bases__属性

    终于介绍完了__init__方法和__new__方法,接下来轻松一下,本节介绍类中内置的__bases__属性. 一. 语法释义 Python 为所有类都提供了一个 bases 属性,通过该属性可以查 ...

  6. 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解

    上节介绍了__new__()方法这个比构造方法还重要的方法的语法,本节通过案例来详细剖析__new__()方法的细节以及它与构造方法之间的关系. 一.    案例说明 本节以圆Cir类为例来说明,为了 ...

  7. python基础之继承实现原理、子类调用父类的方法、封装

    继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...

  8. 第8.11节 Python类中记录实例变量属性的特殊变量__dict__

    一. 语法释义 调用方法:实例. __dict__属性 __dict__属性返回的是实例对象中当前已经定义的所有自定义实例变量的名和值,用字典存储,每个元素为一个"实例变量名:值" ...

  9. 第8.14节 Python类中内置方法__str__详解

    一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...

随机推荐

  1. 最长公共子串算法(Longest Common Substring)

    给两个字符串,求两个字符串的最长子串 (例如:"abc""xyz"的最长子串为空字符串,"abcde"和"bcde"的最 ...

  2. 【SpringBoot】11-1.Springboot整合Springmvc+Mybatis增删改查操作(下)

    整合过程:https://www.isdxh.com/68.html 一.增--增加用户 1.创建实体类 package com.dxh.pojo; public class Users { priv ...

  3. ubuntu下安装nginx -php

    mysql : sudo apt-get install mysql-server mysql-client nginx: sudo apt-get install nginx安装Nginx稳定版本 ...

  4. 5、Python语法之基本数据类型

    一 引入 我们学习变量是为了让计算机能够像人一样去记忆事物的某种状态,而变量的值就是用来存储事物状态的,很明显事物的状态分成不同种类的(比如人的年龄,身高,职位,工资等等),所以变量值也应该有不同的类 ...

  5. Spring Boot 2.4.0 正式发布!全新的配置处理机制,拥抱云原生!

    2020年11月12日,Spring官方发布了Spring Boot 2.4.0 GA的公告. 在这个版本中增加了大量的新特性和改进,下面我们一起看看在这个重要版本中都有哪些值得关注的内容! 更新内容 ...

  6. Python学习笔记4:函数

    1.函数 函数就是一段具有特点功能的.可重用的语句组. 在Python中函数是以关键词 def 开头,空格之后连接函数名和圆括号(),最后一个冒号:结尾. 函数名只能包含字符串.下划线和数字且不能以数 ...

  7. 查询Ceph的OSD占用内存

    前言 之前写过一篇关于查询OSD的运行的CPU的情况的分享,本篇是讲的获取内存占用的,代码包括两种输出,一种是直接的表格,一种是可以方便解析的json 代码 直接上代码,python才用不久,所以可能 ...

  8. cephfs删除报nospace的问题

    ceph Vol 45 Issue 2 CephFS: No space left on device After upgrading to 10.2.3 we frequently see mess ...

  9. deepin 20安装后系统没有声音解决方案(亲测有效)

    打开终端: sudo vi /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT原有配置后面添加 snd_hda_intel.dmic_detect=0 即GRUB ...

  10. 详解Java锁的升级与对比(1)——锁的分类与细节(结合部分源码)

    前言 之前只是对Java各种锁都有所认识,但没有一个统一的整理及总结,且没有对"锁升级"这一概念的加深理解,今天趁着周末好好整理下之前记过的笔记,并归纳为此博文,主要参考资源为&l ...