2017-09-24 49 views
-4

讓我舉個簡單的例子:如何使用實例作爲屬性?

如果我想使用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方法,它自動告訴它有什麼槽尺寸?

+0

你想硬編碼罐大小的不同型號或你想要的尺寸爲'汽車.__ init__'額外的參數傳遞? – MSeifert

+0

使用字典將汽車映射到坦克大小。 – wwii

回答

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() 
+0

WOW謝謝!!! –

+0

@ Code_Control_jxie0755請注意編輯 –

+0

最終,這本字典必須在Car類中,而不是在Tank類中。是否有可能在坦克課上寫作,因爲這看起來更有條理。 –

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 
+0

但我想在這裏,是爲了避免輸入tank_size我自己。 Insteand,我希望坦克信息方法根據汽車模型自動給出不同的坦克尺寸。簡單地說,要將self.model鏈接到tank_size,並創建一個關係或字典呢? –

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() 
+0

但我想在這裏,是爲了避免輸入tank_size我自己。 Insteand,我希望坦克信息方法根據汽車模型自動給出不同的坦克尺寸。簡單地說,要將self.model鏈接到tank_size,並創建一個關係或字典呢? –

+0

固定有一本詞典 – kaza