2015-06-10 4 views
-3

Я создал несколько объектов в Python Но когда я пытаюсь вспомнить их назад я получаю сообщение об ошибке под названием «„INT“Объект не имеет атрибута»Как перезвонить объект, созданный в Python

Пожалуйста, обратите внимание, что параметры VehicleID, VehPosition, VehSpeed ​​постоянно обновляются программой. Я хочу хранить все данные в отдельных объектах.

Вот мой код

objectNumber.py

class VehicleNumber: 

def __init__(self, name): 
    self.name= name 
    self.SpeedList=[] 
    self.PositionList=[] 

def set_Speed (self,VehicleSpeed): 
    self.SpeedList.append(VehicleSpeed) 


def set_Position (self,VehiclePosition): 
    self.PositionList.append(VehiclePosition) 

Вот мой главный класс

class main : 
VList = [] 
def calculation(): 
       VehicleID =infVeh.ID # VehicleID is an Integer which is generating from a program each time I run this code ex :- 1 ,2 ,3 ,4 ,5 
       VList.append(VehicleID) 
       condition = VehicleID in VList 

       if (condition == False) : 
        VList.append(VehicleID) 
        VehicleID = VehicleNumber('car') 
        VehicleID.set_Speed(VehSpeed) 
        VehicleID.set_Position(VehPosition) 
        print(VehicleID.SpeedList) 
        print(VehicleID.PositionList) 

       else : 
        VehicleID.set_Speed(VehSpeed) 
        VehicleID.set_Position(VehPosition) 
        print (VehicleID.SpeedList) 

Когда я запускаю код без еще части она работает нормально, но когда я ставлю другая часть назад снова дает мне «int» Объект не имеет атрибута «set_Speed»

Моя первоначальная цель заключалась в создании нового объекта для каждого автомобиля, который поступает в систему, а затем для обновления его скорости и положения.

Большого спасибо заранее

+0

Внутри функции 'calculate()' Я не вижу, что определен VehicleId. Кажется, что вы делаете его целым числом как-то, а не экземпляром 'VehicleNumber' – camz

+0

Просто короткий вопрос, в главном файле, что такое' VehicleID'? Вы объявили об этом и инициализировали его «Нет»? Условие всегда 'False', поэтому нет ошибки без' else' – Bharadwaj

+0

P.s. 'if (condition == False)' никогда не будет истинным в вашем случае, а ваш отступ немного странный. – camz

ответ

-1

Поместить каждый объект в словаре вместо списка и использовать идентификатор VehicleID для получения VehicleNumber объекта.

Что-то вроде:

class VehicleNumber: 

    def __init__(self, id_, name): 
     self.id_ = id_ 
     self.name= name 
     self.SpeedList=[] 
     self.PositionList=[] 

    def set_Speed (self,VehicleSpeed): 
     self.SpeedList.append(VehicleSpeed) 

    def set_Position (self,VehiclePosition): 
     self.PositionList.append(VehiclePosition) 


__main__: 
    VDict = {} 
    def calculation(VehicleID, VehSpeed, VehPosition): 
     if not VehicleID in VDict: 
      vehicle = VehicleNumber(VehicleID, 'car') 
      vehicle.set_Speed(VehSpeed) 
      vehicle.set_Position(VehPosition) 
      VDict[VehicleID] = vehicle 
      print(vehicle.SpeedList) 
      print(vehicle.PositionList) 
     else : 
      vehicle = VDict.get(VehicleID) 
      vehicle.set_Speed(VehSpeed) 
      vehicle.set_Position(VehPosition) 
      print (vehicle.SpeedList) 

    calculation(1, 50, 'home') 
    calculation(1, 60, 'work') 
    calculation(2, 80, 'other') 
    print(VDict.get(1).__dict__) 
+0

Спасибо Marco Я попробую этот код и дам вам знать. Ценю вашу помощь – DrakonianD

0

Вы запутались среди int идентификатора транспортного средства и пользовательский класс VehicleNumber объекта.

Причина, по которой вы не сталкиваетесь с ошибками без предложения else, - ваш if никогда не будет выполнен.

После того, как вы это делаете:

VList.append(VehicleID) 

условие никогда не станет ложным. Также в предложении if у вас есть

В предложении else, однако, у вас нет этого объекта. Я предполагаю, что вы хотите работать с этим объектом, а не с целым числом VehicleID. я предлагаю переименовать его в

vehicle = VehicleNumber('car') 
2

Непосредственный ответ на ваш вопрос в том, что ваш «еще пункт» никогда не определяет VehicleID. Соответствующая строка в вашем «если условие» будет:

VehicleID = VehicleNumber('car') 

Это позволяет вызывать ваш сеттер-методу vehicleID (который является экземпляром VehicleNumber).

Поскольку вы не делали подобного экземпляра VehicleNumber в своей «else-clause», вы также не сможете вызвать его методы.

Теперь, как и другие, я полагаю, вы фактически не вставляли весь свой класс. потому что из опубликованного вами фрагмента неясно, почему VehicleID должен начинаться с этого. Правильно ли мы предполагаем, что где-то в вас «основной класс» определяют/передают VehicleID?

Concering вам условно-заявление: почему бы не использовать что-то вроде

if VehicleID in VList: 
    foo 
else: 
    bar 

Суммируя вещи в свете вашей дополнительной информации/Под ред вопросом, как следующее должно вас происходит.


class Main(object): 
    vehicle_id_list = [] 

    def calculation(self): 
     vehicle_id = infVeh.ID # some magical integer that we acept as deu ex machina 
     self.vehicle_list.append(vehicle_id) 
       condition = VehicleID in VList 

     if vehicle_id not in self.vehicle_id_list: 
      vehicle_id_list.append(vehicle_id) 
      vehicle = VehicleNumber('car') 
      vehicle.set_Speed(VehSpeed) 
      vehicle.set_Position(VehPosition) 
      print(vehicle.SpeedList) 
      print(vehicle.PositionList) 
     else : 
      vehicle = VehicleNumber('car') 
      vehicle.set_Speed(VehSpeed) 
      vehicle.set_Position(VehPosition) 
      print (VehicleID.SpeedList) 

Теперь, все, что вы действительно заботиться с вами условного оператора, чтобы проверить, если идентификатор транспортного средства уже в вас список или нет. если вы не хотите его добавлять. После того, как было учтено условие if, а также else-clause, выполните одно и то же: вызовите ваши сеттеры и распечатайте результат. Вы могли бы также сократить это:

if vehicle_id not in self.vehicle_id_list: 
    vehicle_id_list.append(vehicle_id) 
vehicle = VehicleNumber('car') 
vehicle.set_Speed(VehSpeed) 
vehicle.set_Position(VehPosition) 
print(vehicle.SpeedList) 
print(vehicle.PositionList) 

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

  • PEP 8 дать некоторые полезные рекомендации в отношении класса и имена атрибутов
  • каждый identation должен быть 4 spaces
  • может быть «Автомобиль» будет более apropiate имя класса, чем VehicleNumber, видя, что ваш объект хранит гораздо больше информации о транспортного средства ..
  • соответственно, когда вы инициируете конкретный номер транспортного средства (как и в своем «условии», если вы можете хранить его в переменной типа «транспортное средство», а не «идентификатор транспортного средства»).
  • В отличие от многих других языков OO, python не поощряет setter/getters. Для ознакомления см. here
Смежные вопросы