2013-11-10 7 views
3

Я полагаю, что я неправильно понимаю, как наследование типов работает в python.Python унаследованные переменные типа

Хотя я определяю переменную внутри родительского класса, любой класс Child унаследован в родительском , ссылаясь на одну и ту же переменную от родителя.

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'] 

То, что я пытаюсь достичь store словаря будет создан экземпляр в каждом Child класса, унаследованного от Parent. Таким образом, ссылки ChildB.store['key1'] поднимет KeyError

Я пытался использовать __new__ для создания словаря экземпляра в то время как тип создание:

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

Но это, кажется, как __new__ работает только до инстанцирования Child класса, так что ссылки на переменном с помощью типа (например Child.store поднимается AttributeError)

Так есть ли способ достичь поведения, которого я хочу?

+3

Вы хотите метакласса, который является "класс класса". Например, см. Http://eli.thegreenplace.net/2011/08/14/python-metaclasses-by-example/ –

+0

Возможный дубликат [Почему моя переменная экземпляра не указана в \ _ \ _ dict \ _ \ _?] (http://stackoverflow.com/questions/35805/why-is-my-instance-variable-not-in-dict) – oefe

ответ

3

Вы хотите использовать метакласс, который позволяет инициализировать класс определения, например, как конструктор позволяет инициализировать экземпляр. Для получения дополнительной информации см. http://eli.thegreenplace.net/2011/08/14/python-metaclasses-by-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'] 

приведет к

Traceback (most recent call last): 
    File "test.py", line 20, in <module> 
    print ChildB.store['key1'] == ChildA.store['key2'] 
KeyError: 'key1' 
Смежные вопросы