如何回调在Python中创建的对象

时间:2015-06-10 12:16:57

标签: python list object inheritance

我用Python创建了几个对象但是当我试图回想起它时我得到一个名为“'int'的错误对象没有属性”

请注意参数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'

我最初的目标是为每辆进入系统的车辆创建一个新对象,然后更新其速度和位置。

非常感谢你提前

3 个答案:

答案 0 :(得分:2)

您问题的直接答案是您的“else子句”从未定义 VehicleID 。 “if子句”中的相应行将是:

VehicleID = VehicleNumber('car')

这样做可以让你在vehicleID上调用你的setter-methods(这是VehicleNumber的一个实例)。

由于您没有在“else-clause”中对VehicleNumber进行类似的实例化,因此您也无法调用其方法。

现在,就像其他人一样,我认为你并没有真正粘贴整个班级。因为你发布的片段不清楚为什么要开始使用VehicleID。我们是否正确地假设您“main-class”中的某个地方定义/移交VehicleID?

为您提供条件声明: 为什么不使用像

这样的东西
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)

现在,您真正关心的是条件声明是检查车辆ID是否已经在您的列表中。如果不是你想要追加它。 之后已经考虑了if子句以及else子句做同样的事情:调用你的setter并打印结果。 你不妨将其缩短为:

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提供有关课程和属性名称的一些有用建议
  • 每个标识应为4 spaces
  • 也许'车辆'会比车辆编号更适合一个班级名称,因为你的对象存储了更多关于车辆的信息..
  • 因此,当你实例化特定的VehicleNumber时(就像你在“if子句”中那样),你可以将它存储在像“vehicle”这样的变量中,而不是“VehicleID”。
  • 与许多其他OO语言不同,python不鼓励setter / getters。有关简介,请参阅here

答案 1 :(得分:0)

您在int车辆ID和自定义类VehicleNumber对象中感到困惑。

没有使用else子句而没有遇到错误的原因是if永远不会被执行。

执行此操作后:

VList.append(VehicleID)

条件永远不会变错。同样在if子句中,你有

VehicleID = VehicleNumber('car')

在else子句中,您没有创建此对象。我想你想要的是对这个对象进行操作而不是整数VehicleID。 我建议你重命名为

vehicle = VehicleNumber('car') 

答案 2 :(得分:-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__)