繁体   English   中英

如何使用另一个类的实例作为属性实例化一个类?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM