Python - 多个类和函数

时间:2013-12-02 19:36:08

标签: python class

我的目标是创建一个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()

1 个答案:

答案 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()