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。
接著,在一個另一個新的文件中,寫下如下代碼:
看輸出:
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函数里参数的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 带参数的多重继承
- 下一篇: Python动态变量名定义与调用