2014-01-07 5 views
0

Я использую не-известную структуру под названием IPKISS; надеюсь, это не имеет значения.Ошибка при наследовании в python

from ipkiss.all import *  

class ElectrodePair(Structure): 
    """An electrode component to be used for a PPLN design.""" 

    __name_prefix__ = "ELECTRODE_PAIR" 

    width = PositiveNumberProperty(required = True) 
    height = PositiveNumberProperty(required = True) 
    seperation = PositiveNumberProperty(required = True) 

    lay1 = Layer(number = 1, name = "boundaries") 

    def define_elements(self, elems): 
     left = ShapeRectangle(center = (-self.seperation*0.5,0.), box_size = (self.width, self.height)) 
     right = ShapeRectangle(center = (self.seperation*0.5,0.), box_size = (self.width, self.height)) 

     elems += Boundary(layer = self.lay1, shape = left) 
     elems += Boundary(layer = self.lay1, shape = right) 
     return elems 



class ElectrodeStructure(ElectrodePair): 
    """An array of electrodes.""" 

    __name_prefix__ = "ELECTRODE_STRUCTURE" 

    amount = PositiveNumberProperty(required = True) 
    spacing = PositiveNumberProperty(required = True) 

    def define_elements(self, elems): 
     electrodePair = ElectrodePair.__init__(self) 
     elems += ARefX(reference = electrodePair, origin = (0,0), period_1d = self.spacing, n_o_periods_1d = self.amount) 
     return elems 



def main(): 
    FILE_NAME = "ElectrodeArray.gds" 
    electrodeArray = ElectrodeStructure(amount = 10, height = 100., seperation = 20, spacing = 10., width = 2.) 

    electrodeArray.write_gdsii(FILE_NAME) 


if __name__ == "__main__": 
    main() 

Я понятия не имею, почему это ошибка. Ошибка:

File "/usr/local/lib/python2.7/dist-packages/IPKISS-2.4_ce-py2.7.egg/ipcore/properties/initializer.py", 
line 327, in __init__ raise IpcoreAttributeException("Required property '%s' is not found in keyword arguments of '%s' initialization." % (p, str(type(self)))) 
ipcore.exceptions.exc.IpcoreAttributeException: Required property 'amount' is not found in keyword arguments of '<class '__main__.ElectrodeStructure'>' initialization. 

Кажется, как будто это не доволен тем, как я прошел мои аргументы, я попытался кучу вещей и не могу заставить его работать. Совет будет высоко оценен.

Я подозреваю, что ошибка вызвана electrodePair = ElectrodePair.__init__(self).

Спасибо за ваше время.

+0

Да, вы должны указать количество в инициализаторе ElectrodePair – hd1

ответ

0
class ElectrodeStructure(ElectrodePair): 
    [...] 

    def define_elements(self, elems): 
     electrodePair = ElectrodePair.__init__(self) 
     [...] 

При создании в main() новый ElectrodeStructure, вы передаете keword аргументы. Безусловно, вы не определяете функцию __init__ в ElectrodeStructure, супер __init__ вызывается с этими аргументами (включая amount, поэтому нет ошибки).

После этого в define_elements вы снова вызываете __init__, за исключением того, что вы не передаете никаких аргументов, которые вызывают ошибку.

Кроме того, это утверждение:

 electrodePair = ElectrodePair.__init__(self) 

ли присвоение значения возврата (вероятно None) от ElectrodePair.__init__(self) к electrodePair. Я подозреваю, что вы хотите что-то вроде следующего:

 electrodePair = ElectrodePair(amount=1, etc.) 

Похоже, вы хотите композицию, а не наследование; вы можете инициализировать свой подкласс надлежащей функцией __init__ (как описывает @volcano) или просто создать класс класса ElectrodePair, а не наследовать вообще.

1

Вы должны добавить __init__ метод к вашему ElectrodeStructure класса, что - как @ hd1 указал - должен установить количество:

class ElectrodeStructure(ElectrodePair): 
    def __init__(self, amount): 
     ElectrodePair.__init__(self) 

способ вызова ElectrodePair .__ init__ является неправильным, так как в отсутствие ElectrodeStructure .__ init__ в своем классе бывший будет называться автоматически

EDIT:

Пара вещей, которые я уведомлен ced on re-reading - вы наследуете от класса, а затем в методе класса вы создаете объект родительского класса. Что-то здесь не так

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