python中init方法的作用_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

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__': , '__dict__': , '__weakref__': , '__doc__': None}

mydict

注意:这都是表面的东西,关于内部机制我还没去弄。有一天如果我弄了,再来补充。

版权:保留所有权,转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值