Как получить доступ, изменить и проверить значения в подклассе, как список - PullRequest
0 голосов
/ 17 октября 2019

Прошу прощения за строку темы, если она не точно описывает то, что я пытаюсь сделать. Я не уверен, как еще описать это.

У меня есть класс, который содержит подкласс. В подклассе есть значение, которое является списком. Используя мой основной класс, я хочу иметь возможность извлекать и устанавливать каждое отдельное значение в этом списке. Приведенный ниже код является примером того, что я пытаюсь сделать, и, очевидно, не работает:

В этом примере у меня есть машина. Каждая машина будет иметь четыре шины. Я хочу быть в состоянии найти и установить тип шины для каждого колеса моего автомобиля в отдельности. Я также хочу, чтобы проверка помешала мне поставить на машину нежелательный тип шин (Firestone).

class Car:

    def __init__(self, model: str):

        self._model = model
        self._tires = self.Tires()

    class Tires():

        def __init__(self):

            # Default to no tires on the car
            self._tires = ["", "", "", ""]

# Create my car
my_car = Car("LeSabre")

# Put four tires on my car. I don't want Firestones, so it should error on the last two tires. How to validate???
my_car.Tires[0] = "Goodyear"
my_car.Tires[1] = "Goodyear"
my_car.Tires[2] = "Firestone"
my_car.Tires[3] = "Firestone"

# What is the second tire on my car?
print(my_car.Tires[1])

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Спасибо за комментарии. Это помогло мне понять, что я пытаюсь сделать. Это то, что я придумал. Возможно, он не самый лучший или самый красивый, но он работает ...

Я определенно открыт для комментариев по этому коду.

class Car:

    def __init__(self, model: str):

        self._model = model
        self._tires = ["", "", "", ""]

    def tires(self, tires: list = None) -> list:
        """

        :param tires: A list of four tires to put on the car

        :return: A list of tires on the car
        """

        # If we specified some tires...
        if tires is not None:
            # ... there must be 4 of them
            if len(tires) != 4:
                raise Exception("Wrong number of tires for a car")

            # Change all four tires
            for t in range(0, 4):
                self.tire(t, brand=tires[t])

        return self._tires

    def tire(self, index:int, brand: str = None):
        """

        :param self:
        :param index: Which tire are we accessing
        :param brand: What brand of tire are we putting on

        :return: The brand of tire at that index
        """

        # There can only be four tires
        if index < 0 or index > 3:
                raise Exception("Invalid tire selected")

        if brand is not None:
            # Make sure they don't put a Firestone on my car
            if brand == "Firestone":
                    raise Exception("Don't use Firestone tires")
            else:
                self._tires[index] = brand

        return self._tires[index]

# Create my car
my_car = Car("LeSabre")

# Put four tires on my car. I don't want Firestones, so it should error on the last two tires. How to validate???
my_car.tire(0, "Goodyear")
my_car.tire(1, "Goodyear")
my_car.tire(2, "Uniroyal")
my_car.tire(3, "Uniroyal")

# What is the third tire on my car?
print(my_car.tire(2))
# What are all the tires on my car?
print(my_car.tires())
# Put a Firestone on my car
my_car.tire(1, "Firestone")
0 голосов
/ 17 октября 2019

Вы можете использовать UserList библиотеку Python упаковщик списка . Его элементы хранятся в базовом списке в атрибуте data.

Модифицированный исходный код:

import collections
from collections import UserList
class Car:

    def __init__(self, model: str):

        self._model = model
        self._tires = self.Tires()

    class Tires(UserList):

        def __init__(self):
            self.data = ["", "", "", ""]

my_car = Car("LeSabre")

my_car._tires[0] = "Goodyear"
my_car._tires[1] = "Goodyear"
my_car._tires[2] = "Firestone"
my_car._tires[3] = "Firestone"

print(my_car._tires[1])

печатает Goodyear

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...