python的init函数里参数的作用
问题发现
一直有一个疑问,有时我们在继承时,在__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)
此时,用一样的代码就可以得到期待输入:
from mydict import Dict
a = Dict(a = 1, b = 2)
print(a)
#output:
{'a': 1, 'b': 2}
更进一步
上面的问题解决后,我们有发现了另一个问题:
继承的类和原来的类有什么区别?
关于python对于继承的内部机制我不懂的。只能从看的见的入手。还是用上面的mydict.py模快,用下面代码来测试:
from mydict import Dict
print(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函数里参数的作用的更多相关文章
- Python入门篇-函数、参数及参数解构
Python入门篇-函数.参数及参数解构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数概述 1>.函数的作用即分类 函数 数学定义:y=f(x) ,y是x的函数,x ...
- python 中_init_函数以及参数self
1)class类包含: 类的属性:类中所涉及的变量 类的方法:类中函数 2)_init_函数(方法) 1.首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问. 2. ...
- python 复习 4-1 函数、参数、返回值、递归
函数 完成特定功能的一个语句组,这个语句组可以作为一个单位使用,并且给它组语句取一个名子,即函数名 可以通过函数名在程序不同地方多次执行,即函数调用 预定义函数(可以直接使用) 自定义函数(自编写的) ...
- 第5.3节 详说Python风格的函数分配参数
一. 分配参数的定义 参数收集就是在定义函数时不能确认参数个数,用收集参数将调用时不确定数量的实参存放到收集参数的元组中.分配参数与此过程相反,它不是在定义函数形参时使用星号(1个或2个),而是 ...
- python学习Day11 函数的参数列表
复习 什么是函数? 具体特定功能的代码块 - 特定功能代码作为一个整体,并给该整体命名,就是函数 函数的优点 : 1.减少代码的冗余,2.结构清晰,可读性强 3.具有复用性,开发效率高,维护成本高 如 ...
- Day07 (黑客成长日记) 函数的参数及作用
定义函数: 1.定义函数注意: (1)位置参数:直接定义函数. def func(a,b): print(a,b) func(1,2) (2)默认参数:关键字参数:参数名= ‘默认的值‘ def fu ...
- Python中定义函数时参数有默认值的小陷阱
在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类 ...
- python中定义函数和参数的传递问题
作者:達聞西链接:https://zhuanlan.zhihu.com/p/24162430来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 5.2.4 函数.生成器和类 ...
- python中的函数的参数和可变参数
最近在搞python的过程中需要用到给函数传可变参数..所以去网上找前人的帖子学习了一下 为了尊重原作者,这里附上链接:http://www.cnblogs.com/tqsummer/archive/ ...
随机推荐
- dp(完全背包)
有 NN 种物品和一个容量是 VV 的背包,每种物品都有无限件可用. 第 ii 种物品的体积是 vivi,价值是 wiwi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大. ...
- 【PAT甲级】1084 Broken Keyboard (20 分)
题意: 输入两行字符串,输出第一行有而第二行没有的字符(对大小写不敏感且全部以大写输出). AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #inclu ...
- 实验四《Android程序设计》
实验四<Android程序设计> 一.实验内容 1.Android Stuidio的安装测试 2.Activity测试 3.UI测试 4.布局测试 5.事件处理测试 二.实验步骤 第一部分 ...
- 红黑树java代码实现
红黑树 思想源于:https://www.cnblogs.com/nananana/p/10434549.html有解释有图,很清晰(删除时需考虑根节点和兄弟节点的子节点是否存在) package t ...
- BUG搬运工:CSCun88303-CIMC Memory Leak : Can't SSH/HTTP to CIMC
Symptom:Unable to SSH/HTTP to the CIMC of the C-series server, however the CIMC can be pinged. Also ...
- 【PAT甲级】1064 Complete Binary Search Tree (30 分)
题意:输入一个正整数N(<=1000),接着输入N个非负整数(<=2000),输出完全二叉树的层次遍历. AAAAAccepted code: #define HAVE_STRUCT_TI ...
- Esp32的一些资料链接
http://wiki.ai-thinker.com/doku.php/utils/esp32_idf_menuconfig http://wiki.ai-thinker.com/doku.php ...
- 查看服务器CPU相关信息!
# 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即 ...
- mysql操作之密码的那点小事
mysql 修改密码的2种方式: 进入mysql库的user表中修改 update mysql.user password = password("新密码") where 条件; ...
- 4 htmlCSS&图像&表格&列表&表单&框架&颜色
CSS: Cascading Style Sheeet 层叠样式表 cascadig:瀑布 html:网页的结构 css:网页的外观 JavaScript:网页的动作 CSS的使用方式: 内联样 ...