2013-07-15 7 views
3

У меня есть классы структуры, как это:запрессовки поля значения

class A(object): 
    array = [1] 

    def __init__(self): 
     pass 

class B(A): 
    array = [2, 3] 

    def __init__(self): 
     super(B, self).__init__() 

class C(B): 
    array = [4] 

    def __init__(self): 
     super(C, self).__init__() 
     print array 

И когда я делаю:

c = C() 

Я хочу, чтобы объединить все свои поля в порядке наследования. И напечатайте [1, 2, 3, 4]. Как я могу это сделать?

ответ

2

Для того, чтобы классы изменять их атрибуты класса во время класса четкости (без шаблонного кода внутри каждого определения класса), вам нужен класс декоратора или метакласса.

Если вы используете декоратор класса, вам придется индивидуально оформлять каждый класс.

Если вы используете метакласса, метаклассом class A «s будет наследоваться class B и class C, так что вы только должны изменить class A:

class MetaA(type): 
    def __init__(cls, name, bases, clsdict): 
     super(MetaA, cls).__init__(name, bases, clsdict) 
     for base in bases: 
      if hasattr(base, 'array'): 
       cls.array = base.array + cls.array 
       break 

class A(object): 
    __metaclass__ = MetaA 
    array = [1] 

    def __init__(self): 
     pass 

class B(A): 
    array = [2, 3] 

    def __init__(self): 
     super(B, self).__init__() 

class C(B): 
    array = [4] 

    def __init__(self): 
     super(C, self).__init__() 

урожаи

print(A.array) 
# [1] 

print(B.array) 
# [1, 2, 3] 

print(C.array) 
# [1, 2, 3, 4] 
4

Ну, когда вы определяете array в каждом классе, он будет переопределять значение унаследованного класса.

Если вы хотите это сделать, измените определения классов и добавьте инициализацию array в функцию __init__(self) каждого класса.

I.e.

class A(object): 
    array = [1] 
    def __init__(self): 
     pass 

class B(A): 
    def __init__(self): 
     super(B, self).__init__() 
     self.array += [2,3] 

class C(B): 
    def __init__(self): 
     super(C, self).__init__() 
     self.array += [4] 
     print self.array 
+1

ли путь или нет написать что-нибудь в компиляторе класса А, который присоединится к 'array' для всех его детей? – bobby

+3

Это нехорошее решение, потому что оно будет изменять значения базовых классов 'array', а не просто создавать объединенные версии для подклассов. После того, как вы создадите экземпляр 'C', тогда' A.array' также будет равен '[1, 2, 3, 4]'. Кроме того, если вы дважды создаете 'C',' A.array' станет '[1, 2, 3, 4, 4]' и т. Д. – BrenBarn

Смежные вопросы