dictionary - extending built-in python dict class -


i want create class extend dict's functionalities. code far:

class masks(dict):      def __init__(self, positive=[], negative=[]):         self['positive'] = positive         self['negative'] = negative 

i want have 2 predefined arguments in constructor: list of positive , negative masks. when execute following code, can run

m = masks() 

and new masks-dictionary object created - that's fine. i'd able create masks objects can dicts:

d = dict(one=1, two=2) 

but fails masks:

>>> n = masks(one=1, two=2) traceback (most recent call last):   file "<stdin>", line 1, in <module> typeerror: __init__() got unexpected keyword argument 'two' 

i should call parent constructor init somewhere in masks.init probably. tried **kwargs , passing them parent constructor, still - went wrong. point me on should add here?

you must call superclass __init__ method. , if want able use masks(one=1, ..) syntax have use **kwargs:

in [1]: class masks(dict):    ...:     def __init__(self, positive=(), negative=(), **kwargs):    ...:         super(masks, self).__init__(**kwargs)    ...:         self['positive'] = list(positive)    ...:         self['negative'] = list(negative)    ...:           in [2]: m = masks(one=1, two=2)  in [3]: m['one'] out[3]: 1 

a general note: do not subclass built-ins!!! seems easy way extend them has lot of pitfalls will bite @ point.

a safer way extend built-in use delegation, gives better control on subclass behaviour , can avoid many pitfalls of inheriting built-ins. (note implementing __getattr__ it's possible avoid reimplementing explicitly many methods)

inheritance should used last resort when want pass object code explicit isinstance checks.


Comments

Popular posts from this blog

Line ending issue with Mercurial or Visual Studio -

java - Jtable duplicate Rows -

java - Run a .jar on Heroku -