问题发现

一直有一个疑问,有时我们在继承时,在__init__函数会出现可变参数*arg或关键字参数**kw这样的参数,这些参数有什么用?如果有用,这些参数时如何传递?传递些什么?

注:如果你不知道什么时可变参数,什么是关键字参数,请看这里

解决

今天一个偶然的机会,我在编写单元测试时,发现这些参数的用处。

首先,我们来编写一个简单的模块,这个模块里有一个Dict类,它是继承于内置类型dict,super(Dict, self).__init__()语句说明Dict用父类dict的初始化函数:

class Dict(dict):def __init__(self):super(Dict, self).__init__()

将上面的代码存储到一个独立文件中,在我的实验中,我随意起了一个文件名mydict.py。
接着,在一个另一个新的文件中,写下如下代码:

from mydict import Dict
a = Dict(a = 1, b = 2)

看输出:

Traceback (most recent call last):File "G:\python\17080701.py", line 119, in <module>a = Dict(a = 1, b = 2)
TypeError: __init__() got an unexpected keyword argument 'a'

输出提示是__init__()的到了不期待的参数。很自然的,我就想起之前见过的在__init__()函数里放进可变参数和关键字参数。

稍微改一下,我们便可以得到答案:

class Dict(dict):def __init__(self,*arg, **kw):super(Dict, self).__init__(*arg, **kw)

此时,用一样的代码就可以得到期待输入:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from mydict import Dict
a = Dict(a = 1, b = 2)
print(a)#output:
{'a': 1, 'b': 2}

更进一步

上面的问题解决后,我们有发现了另一个问题:

继承的类和原来的类有什么区别?

关于python对于继承的内部机制我不懂的。只能从看的见的入手。还是用上面的mydict.py模快,用下面代码来测试:

from mydict import Dictprint(dir(Dict))
print(dir(dict))
print(len(dir(dict)))
print(len(dir(Dict)))
for ine in dir(Dict):if ine not in dir(dict):print(ine)
print(Dict.__dict__)
print(Dict.__weakref__)
print(Dict.__module__)

Dict和dict的区别就出来了:

['__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
40
43
__dict__
__module__
__weakref__
{'__module__': 'mydict', '__init__': <function Dict.__init__ at 0x000001F74849BB70>, '__dict__': <attribute '__dict__' of 'Dict' objects>, '__weakref__': <attribute '__weakref__' of 'Dict' objects>, '__doc__': None}
<attribute '__weakref__' of 'Dict' objects>
mydict

注意:这都是表面的东西,关于内部机制我还没去弄。

python的init函数里参数的作用相关推荐

  1. python如何查看函数的参数_python 如何查看自带函数的默认参数?

    python 为什么默认参数不能放在必选参数前面 关于python带默认值的参数只能放在后面的问题曾经不信一见钟情,遇见了你遗失了心:曾经不信爱有多真,遇见了你迷失自己. Python函数里的默认参数 ...

  2. python中init函数详解_Python 中__init__函数以及参数self

    Java网站链接:Java全栈工程师 | 以实例驱动学习 | how2j.cn 1)class类包含: 类的属性:类中所涉及的变量 类的方法:类中函数 2) __init函数(方法) 1.带有两个下划 ...

  3. python怎么理解函数的参数_理解Python中函数的参数

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...

  4. python中__init__函数以及参数self

    1.class类包含: 类的属性:类中所涉及的变量 类的方法:类中函数 2. _init_函数(方法) 首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问. ini ...

  5. 分享几个Python小技巧函数里的4个小花招

    前面讲了很多内容都是关于python的变量,数据结构,下面我们来谈一谈python的函数.python里的函数知识点大概分为 基础的定义使用 , 作用域 和 参数传递 , 高级用法 ,其中参数传递最为 ...

  6. python中choice()函数的参数_Python中choice函数如何实现?

    熟悉Python的小伙伴是知道Python是可以生成随机项的,python中choice函数是random模块的随即取样函数,它可以通过导入 random 模块,调用 random 静态对象生成Pyt ...

  7. Python数据分析常用函数及参数详解,可以留着以备不时之需

    利用Python进行数据分析最核心的库就是Pandas,可以说,掌握了Pandas库,Python数据分析就属于中阶水平了. 在<一次简单.完整的全流程数据分析,让我们不再害怕Python &g ...

  8. python函数做n_【python】定义函数、参数、递归(n!)

    函数### 函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个"别名": >>> a = abs # 变量a指向abs函 ...

  9. python学习之函数的参数类型

    函数的参数类型有很多,比如说:位置参数.默认值参数.关键参数.命名关键参数.可变长度参数 (1)>>> 函数名              查看函数的内存地址 (2)>>& ...

最新文章

  1. 网络工程师学Linux 必须掌握命令
  2. hdu-5900 QSC and Master(区间dp)
  3. SQL Injection(SQL注入)介绍及SQL Injection攻击检测工具
  4. replace into
  5. 五边形创意画_绝了,自己做吊灯,创意满满!不仅好看还省钱!
  6. java swing 面试题_下面有关JAVA swing的描述,说法错误的是?
  7. 如何在Javascript中创建范围
  8. AngularJS中$timeout和$interval的用法详解
  9. 马来游记(2)- 漂浮云顶间。。。
  10. Windows驱动开发之DDK与WDK、WDM的区别
  11. 手机淘宝APP怎么复制商品链接发送到微信公众号查询淘宝优惠券及淘宝返利?
  12. 零厨艺也只需10分钟就能让厨房剩货大变身——牛肉饭
  13. 设计模式——策略模式
  14. 数学随记 微积分学习之极限概念的体会
  15. 红米NOTE5 ROOT教程
  16. 国际会议latex/overleaf模板
  17. Fastformer论文解读
  18. Ubuntu 下挂ISO到虚拟光驱的方法
  19. 如何在Window7下彻底清除360注册表
  20. 阿里云服务器通用型实例g5 怎么样好不好?性能配置分析

热门文章

  1. 作《互联网时代的软件革命--SaaS架构设计》上市了
  2. CentOS修改yum源为阿里云
  3. 移动web开发都会遇到的坑(会持续更新)
  4. [转载]windows7中没用boot.ini文件而是改用BCDEDIT来配置了
  5. web service方法进行全文检索_SpringMVC(Web应用)配置教程终章项目实战
  6. 【学习笔记】Python - PyQt
  7. 【性能优化】EKPO/EKBE和LIPS做JOIN的问题
  8. 比特币经历价格过山车 理财还是乐金所、ppmoney网贷靠谱
  9. S/4 HANA – 是ERP皇帝的新装,还是SAP王国的新基石
  10. 结转本年利润的有关分录