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

java - Run a .jar on Heroku -

java - Jtable duplicate Rows -

validation - How to pass paramaters like unix into windows batch file -