[英]How to instantiate a class with another class' instance as attribute?
我正在嘗試自己學習 Python。 我有這個代碼片段:
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.tank = Tank()
class Tank():
def __init__(self, *args, **kwargs):
self.tank_size = kwargs.get('tank_size', None)
def describe_tank(self):
print("This car has a " + str(self.tank_size) + "-L tank.")
是否可以實例化 Car 而不在 Tank 類的__init__
中為參數tank_size
指定默認值? 謝謝你。 PS 稍微編輯代碼以使其更合乎邏輯。
我認為您可以嘗試使用 kwargs.get 訪問它並在那里提供默認值。
def __init__(self, *args, **kwargs):
self.tank_size = kwargs.get('tank_size', None)
所以現在你可以將 tank_size 傳遞給 Car 構造函數,並進一步傳遞給 Tank 的構造函數。 如果您仍然不想使用默認值,您可以再次通過 kwargs 傳遞它。
def __init__(self, make, model, year, **kwargs):
self.make = make
self.model = model
self.year = year
self.tank = Tank(**kwargs)
所以它會像
class Car():
def __init__(self, make, model, year, **kwargs):
self.make = make
self.model = model
self.year = year
self.tank = Tank(**kwargs)
class Tank():
def __init__(self, *args, **kwargs):
self.tank_size = kwargs.get('tank_size', None)
def describe_tank(self):
if self.tank_size:
print("This car has a " + str(self.tank_size) + "-L tank.")
else:
print("No info about the tank.")
car = Car("bmw", "m5", 2000)
car.tank.describe_tank()
new_car = Car("bmw", "m5", 2000, tank_size=3)
new_car.tank.describe_tank()
你可以試試這個,但是這個解決方案會限制你擴展 Tank 類的輸入,你以后必須手動處理所有附加屬性。
class Tank():
def __init__(self, *args,**kwargs):
if args:
self.tank_size = args[0]
else:
self.tank_size = "Not Specified"
def describe_battery(self):
print("This car has a {}-L tank.".format(self.tank_size))
對於字符串格式,我會推薦 .format 內置函數。
您始終可以將其保留為屬性並將其從初始化參數中刪除。
class Car():
def __init__(self, make, model, year):
self.tank = Tank()
class Tank():
def __init__(self):
self.tank_size = None
def set_tank_size(self, size):
self.tank_size = size
def describe_battery(self):
print("This car has a " + str(self.tank_size) + "-L tank.")
或者,如果你想正確地做這件事,你可以使用一個屬性和一個 setter。
from number import Real
class Car():
def __init__(self, make, model, year):
self.tank = Tank()
class Tank():
def __init__(self):
self._tank_size = None
@property
def tank_size(self):
return self._tank_size
@tank_size.setter
def tank_size(self, size):
if not isinstance(size, Real):
raise TypeError('Tank `size` must be a number.')
if not size >= 0:
raise ValueError('Tank `size` must be >= 0.') # electrics have a 0-L tank?
self._tank_size = size
def describe_battery(self):
print("This car has a " + str(self.tank_size) + "-L tank.")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.