2016-05-23 4 views
-2

Я хочу подкласс list в Clause, чтобы дать ему три свойства:Список подклассов: я делаю это правильно?

  1. Каждый элемент Clause является а Lit

  2. Некоторые операторы, такие как | и & перегруженные

  3. Если a и b имеют тип Clause, то есть a+b

Это то, что у меня есть до сих пор, но я уверен, что это неправильно ... что это лучший способ сделать это?

class Clause(list): 
    def __init__(self, raw_list): 
     for lit in raw_list: 
      if not isinstance(lit, Lit): 
       raise TypeError, 'Clause contains non-Lit elements' 
     self = raw_list 

    def __invert__(self): 
     return Formula([Clause([~lit]) for lit in self]) 

    def __or__(self, right): 
     if not isinstance(right, Clause): 
      raise TypeError, 'RHS is not of type Clause' 
     return Formula([self + right]) 

    def __and__(self, right): 
     if not isinstance(right, Clause): 
      raise TypeError, 'RHS is not of type Clause' 
     return Formula([self, right]) 
+0

1. 'для освещено в list' ?? 2. 'self = raw_list' бесполезен. Вы проверили свой код? –

+0

С первого взгляда есть некоторые очевидные ошибки: (1) 'для подсвеченного списка:' не имеет смысла - 'list' - это тип, а не переменная. (2) 'self = raw_list' в конце' __init__' не имеет смысла. Это локальное задание, которое не имеет никакого эффекта. –

+0

(1) извините, опечатка, исправлена ​​(2) ya, я знаю, что это неправильно, мне интересно, какой правильный путь –

ответ

0

Заявление self = raw_list ничего не делает.

Вы должны вызвать список конструктор вместо:

list.__init__(self, raw_list) 
+0

Не лучше ли использовать супер? –

+0

Возможно, но тогда его следует использовать повсюду. Во всем коде, который я пишу (т. Е. В небольшом графическом интерфейсе или инструментах), я нашел более читаемым возможность напрямую вызвать методы __init__ родительских классов, чем использовать супер. Тем не менее, выбор за вами. :) –

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