zoukankan      html  css  js  c++  java
  • 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:python17080701.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__)
    

    Dictdict的区别就出来了:

    ['__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
    

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


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


  • 相关阅读:
    C语言中字符串常用函数--strcat,strcpy
    linux下core dump【总结】
    C语言memset()函数:将内存的前n个字节设置为特定的值
    const的理解、const指针、指向const的指针
    C99标准的新特性
    ISO C语言新标准(C11)
    哪个版本的gcc才支持c11
    不使用session,借助redis实现验证码
    google浏览器截图工具 Open Screenshot(代码截图)
    springmvc+jpa实现分页的两种方式
  • 原文地址:https://www.cnblogs.com/busui/p/7323943.html
Copyright © 2011-2022 走看看