[英]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.