Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python inherited type variables

I suppose i'm misunderstand how type inheritance work in python.

While i'm defining variable inside Parent class, any Child class inherited in parent referencing same variable from parent.

class Parent(object):
    store = dict()

class ChildA(Parent):
   pass

class ChildB(Parent):
   pass

ChildA.store['key1'] = 'val' 
ChildB.store['key2'] = 'val'

print ChildB.store['key1'] == ChildA.store['key2']

What i'm trying to achieve is store dictionary instance to be created in every Child class inherited from Parent. So referencing ChildB.store['key1'] would raise KeyError

I have tried to use __new__ to create dictionary instance while type is creating:

class NewParent(object):  
    def __new__(cls, *args, **kwargs):
        rv = super(NewParent,cls).__new__(cls, *args, **kwargs)
        rv.store = dict()
        return rv

But it's seems like __new__ running only before instantiating Child class, so referencing variable via type (e.g. Child.store is raising AttributeError)

So is there any way to achieve behavior i want?

like image 503
Gening D. Avatar asked Jul 01 '26 20:07

Gening D.


1 Answers

You want to use a metaclass, which lets you initialize a class definition sort of like how a constructor lets you initalize an instance. For more details, see http://eli.thegreenplace.net/2011/08/14/python-metaclasses-by-example/.

Example:

#!/usr/bin/env python2

class ParentMeta(type):
    def __new__(meta, name, bases, dct):
        dct['store'] = dict()
        return super(ParentMeta, meta).__new__(meta, name, bases, dct)

class Parent(object):
    __metaclass__ = ParentMeta

class ChildA(Parent):
    pass

class ChildB(Parent):
   pass

ChildA.store['key1'] = 'val'
ChildB.store['key2'] = 'val'

print ChildB.store['key1'] == ChildA.store['key2']

will result in

Traceback (most recent call last):
  File "test.py", line 20, in <module>
    print ChildB.store['key1'] == ChildA.store['key2']
KeyError: 'key1'
like image 199
li.davidm Avatar answered Jul 04 '26 09:07

li.davidm