如何将实例用作属性?

时间:2017-09-24 15:04:57

标签: python class

让我举一个简单的例子:

如果我想使用Tank Class实例作为汽车的属性。同时,我希望方法tank_info根据Car类中的不同模型给出不同的坦克大小。

class Car():
    def __init__(self, make, model):
        self.make = make
        self.model = model
        self.tank = Tank()

    def get_car_info(self):
        long_name = self.make + ' ' + self.model
        print('The car is', long_name)

class Tank():
    def __init__(self, tank_size=20):
        self.tank_size = tank_size
    def tank_info(self):
        print('The tank size is', self.tank_size, 'gallons')

my_car = Car('Audi', 'A4')
my_car.get_car_info()
my_car.tank.tank_info()

让我们说,奥迪有A4,A6和A8,他们的坦克大小是20,25,30。 我应该如何编写tank_info方法,以便自动判断它有多大的油箱尺寸?

3 个答案:

答案 0 :(得分:2)

您可以在tank_size

中接受Car参数
class Car():
    def __init__(self, make, model, tank_size):
        self.make = make
        self.model = model
        self.tank = Tank(tank_size)

现在你的例子

my_car = Car('Audi', 'A4', 20)
my_car.get_car_info()
my_car.tank.tank_info()

将输出

The car is Audi A4
The tank size is 20 gallons

答案 1 :(得分:2)

您必须将坦克大小存储在实例中。因此,在创建Tank对象时,也可以指定大小。这是您创建汽车油箱的地方,从而创造新的尺寸。

        self.tank = Tank(tank_size)

早些时候是

        self.tank = Tank()

这会打电话给

class Tank():
    def __init__(self, tank_size=20):
        self.tank_size = tank_size

由于您没有传递tank_size,因此默认情况下为所有汽车分配了20个尺寸,这是由tank_size=20引起的。

sizes={
        'Audi': {
                 'A4':25,
                 'A6':30,
                 'A8':35
                },
        'BMW':  {
                 'Series 3':1,
                 'Series 6':2
                }
}

class Car():
    def __init__(self, make, model, tank_size):
        global sizes
        self.make = make
        self.model = model
        self.tank = Tank(sizes[make][model])

    def get_car_info(self):
        long_name = self.make + ' ' + self.model
        print('The car is', long_name)


class Tank():
    def __init__(self, tank_size=20):
        self.tank_size = tank_size
    def tank_info(self):
        print('The tank size is', self.tank_size, 'gallons')

my_car = Car('Audi', 'A4',33)
my_car.get_car_info()
my_car.tank.tank_info()

答案 2 :(得分:1)

您可以通过将油箱尺寸映射封装在单独的字典中来避免输入油箱尺寸。

以下示例显示了如何动态构建逻辑。汽车油箱尺寸封装在油箱尺寸字典的字典中,其中外键表示模型,内键表示品牌。如果您想添加更多车型或品牌,只需将它们添加到car_tank_sizes字典中即可。

另请注意,如果未指定容器尺寸,则默认为20。

class Car():
    car_tank_sizes = {'Audi': {'A4': '20', 'A6': 25, 'A8': 30}}

    def __init__(self, make, model):
        self.make = make
        self.model = model
        self.tank = Tank(Car.car_tank_sizes.get(self.make,{}).get(self.model))

    def get_car_info(self):
        long_name = self.make + ' ' + self.model
        print('The car is', long_name)


class Tank():
    def __init__(self, tank_size):
        if (tank_size is None):
            self.tank_size = 20
        else:
            self.tank_size = tank_size

    def tank_info(self):
        print('The tank size is', self.tank_size, 'gallons')


my_car = Car('Audi', 'A6')
my_car.get_car_info()
my_car.tank.tank_info()

以下替代方法显示了如何将坦克大小封装在坦克本身内。

class Car():
    def __init__(self, make, model):
        self.make = make
        self.model = model
        self.tank = Tank(self.make, self.model)

    def get_car_info(self):
        long_name = self.make + ' ' + self.model
        print('The car is', long_name)


class Tank():
    car_tank_sizes = {'Audi': {'A4': '20', 'A6': 25, 'A8': 30}}

    def __init__(self, make, model):
        self.tank_size = Tank.car_tank_sizes.get(make, {}).get(model, 20)

    def tank_info(self):
        print('The tank size is', self.tank_size, 'gallons')


my_car = Car('Audi', 'A4')
my_car.get_car_info()
my_car.tank.tank_info()