我的目标是创建一个python代码,该代码使用多个类和函数,为每辆车创建一种不同车型和各个属性的索引。这是我到目前为止所拥有的,但我在库存部分遇到了困难,它实际上显示了所有车辆以及它们的属性。有什么建议或帮助吗?
class Vehicle:
def __init__(self, make, model, year, mileage, price):
self.__make = make
self.__model = model
self.__year = year
self.__mileage = mileage
self.__price = price
def iMake(self, make):
self.__make = make
def iModel(self, model):
self.__model = model
def iYear(self, year):
self.__year = year
def iMileage(self, mileage):
self.__mileage = mileage
def iPrice(self, price):
self.__price = price
def getMake(self):
return self.__make
def getModel(self):
return self.__model
def getYear(self):
return self.__year
def getMileage(self):
return self.__mileage
def getPrice(self):
return self.__price
class Car(Vehicle):
#number of doors
def __init__(self, make, model, year, mileage, price, doors):
Vehicle.__init__(self, make, model, year, mileage, price, doors)
self.__doors = doors
def iDoors(self, doors):
self.__doors = doors
def gDoors(self):
return self.__doors
class Truck(Vehicle):
#drive type (2 or 4 wheel drive)
def __init__(self, make, model, year, mileage, price, drive):
Vehicle.__init__(self, make, model, year, mileage, price, drive)
self.__drive = drive
def iDrive(self, drive):
self.__drive = drive
def gDrive(self):
return self.__drive
class SUV(Vehicle):
#passanger capacity
def __init__(self, make, model, year, mileage, price, passengers):
Vehicle.__init__(self, make, model, year, mileage, price, passengers)
def capacity(self, passengers):
self.__passengers = passengers
def gCapacity(self):
return self.__passengers
class Inventory:
def __init__(self, list1 = []):
self.list1 = list1[:]
def addVehicle(self, vehicle):
self.list1.append(vehicle)
def display(self):
print("The inventory count is ", len(self.list1))
for vehicle in self.list1:
vehicle.display()
def main():
inventory = Inventory()
classType = input('Is the vehicle a car, truck, or suv? ')
if classType == 'car':
make = input('Please enter the make of the car: ')
model = input('Please enter the model of the car: ')
year = input('Please enter the year of the car: ')
mileage = input('Please enter the mileage of the car: ')
price = input('Please enter the price of the car: ')
doors = input('Please enter the amount of doors on the car: ')
car = Car(make, model, year, mileage, price, doors)
print('Make: ', car.gMake())
print('Model: ', car.gModel())
print('Year: ', car.gYear())
print('Mileage: ', car.gMileage())
print('Price: ', car.gPrice())
print('Number of doors: ', car.gDoors())
print()
elif classType == 'truck':
make = input('Please enter the make of the truck: ')
model = input('Please enter the model of the truck: ')
year = input('Please enter the year of the truck: ')
mileage = input('Please enter the mileage of the truck: ')
price = input('Please enter the price of the truck: ')
drive = input('Please enter 2 wheel or 4 wheel drive for the truck: ')
truck = Truck(make, model, year, mileage, price, drive)
print('Make: ', truck.gMake())
print('Model: ', truck.gModel())
print('Year: ', truck.gYear())
print('Mileage: ', truck.gMileage())
print('Price: ', truck.gPrice())
print('Type of drive: ', truck.gDrive())
print()
elif classType == 'suv':
make = input('Please enter the make of the suv: ')
model = input('Please enter the model of the suv: ')
year = input('Please enter the year of the suv: ')
mileage = input('Please enter the mileage of the suv: ')
price = input('Please enter the price of the suv: ')
passengers = input('Please enter the capacity of the suv: ')
suv = SUV(make, model, year, mileage, price, drive)
print('Make: ', suv.gMake())
print('Model: ', suv.gModel())
print('Year: ', suv.gYear())
print('Mileage: ', suv.gMileage())
print('Price: ', suv.gPrice())
print('Number of passengers: ', suv.gCapacity())
print()
cont = input('Would you like to add another vehicle? y/n ')
if cont == 'y':
main()
elif cont == 'n':
inventory.display()
答案 0 :(得分:4)
您为Inventory
撰写的内容存在许多问题。
首先,您在大多数方法中都忘记了self
个参数。尝试调用它们时会导致TypeError
。您在课程的很多中遇到此问题,而不仅仅是Inventory
。
其次,您写的是Display
而不是display
- 这些名称不同,所以当您尝试拨打display
时,您会收到AttributeError
。< / p>
第三,您的默认参数list1 = []
表示每个默认构造的Inventory
将共享一个列表,而不是每个列表都有自己的列表。您几乎肯定不希望这样 - 除非您打算在构造时复制列表(使任何两个Inventory
对象不可能共享列表)。如果 你想要什么,我将展示如何做到这一点。
现在,Inventory
只是Vehicle
列表的包装,对吧?所以:
class Inventory:
def __init__(self, list1=[]):
self.list1 = list1[:]
def addVehicle(self, vehicle):
self.list1.append(vehicle)
def display(self):
print("Inventory count:", len(self.list1))
for vehicle in self.list1:
vehicle.display()
同时,您的各种Vehicle
子类覆盖基类display
方法,这意味着他们必须显式调用基本方法,通过super
,或者必须替换它本来会做的一切。例如,在Car
:
def display(self):
super(Car, self).display()
print("Number of doors: ", self.doors)
另一个问题是你的一些子类具有相同名称的方法和属性,如下所示:
def doors(self, doors):
self.doors = doors
一旦你打电话给你,你再也不能再调用doors
方法,因为它现在被门的数量隐藏了。 (另外,如果您在调用display
之前致电doors
,它会将doors
方法对象显示为门数,这非常难看。)
事实上,你可能不想要像这样的“setter”方法。在构造函数中设置值,如果希望用户在构造后更改值,则可以直接更改属性。所以,例如:
class Car(vehicle):
def __init__(self, make, model, year, mileage, price, doors=4):
super(Car, self).__init__(make, model, year, mileage, price)
self.doors = doors
def display(self):
# etc.
然后:
car = Car(make, model, year, mileage, price, doors)
如果你想记住所有这些车辆,你必须告诉Python记住它们。您可以在创建列表时append
将每个列表添加到列表中,也可以首先将addVehicle
全部列入Inventory
。像这样:
elif classType == 'truck':
make = raw_input('Please enter the make of the truck: ')
# etc.
truck.display()
inventory.addVehicle(truck)
当然,您必须事先完成inventory = Inventory()
。
同时,从您使用raw_input
开始,这显然是Python 2.这意味着您正在创建旧式类。永远不要那样做。始终从object
继承您的基类。
此外,在Python 2中,print("a", 2)
不会打印a 2
,它会打印('a', 2)
,这可能不是您想要的。在这种情况下,您可以在脚本的最顶部使用from __future__ import print_function
来获取Python 3的行为。如果不这样做,则需要将打印语句更改为不包括括号。
或者,更好的是,使用字符串格式,因此您只需要打印一个参数,例如print("Price: {}".format(self.price))
,它将在Python 2和Python 3中执行完全相同的操作。
最后,如果你想要反复循环遍历main
的主体,那么使用while
循环要好得多,而不是从自身递归调用main()
。
但事实上,你可能更乐意将整个身体分解为一个单独的oneVehicle
函数,它只返回用户创建的任何车辆。 (请注意,这可以是None
,因为您允许他们在没有错误的情况下键入废话。只要您处理它,这很好。)然后main
可能如下所示:
def main():
inventory = Inventory()
while True:
vehicle = oneVehicle()
if vehicle:
inventory.addVehicle(vehicle)
cont = raw_input('Would you like to add another vehicle? y/n ')
if cont != 'y':
break
inventory.display()