簡體   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