Детские классы обмениваются данными, которые они не должны - PullRequest
0 голосов
/ 29 января 2020

У меня есть класс Device, у которого двое детей: SmartSwitch и Refrigerator. Моя проблема в том, что SmartSwitch имеет атрибуты, которые я назначил для Холодильника, что не должно происходить.

Вот как я распечатываю вывод:

device_dict = {}
device_dict["Kitchen Fridge"] = Refrigerator("Kitchen Fridge", 2)
device_dict["Water Heater Switch"] = SmartSwitch("Water Heater Switch")
for device_name2 in device_dict:
    print("{}:\n{}\n-----\n".format(device_name2, device_dict[device_name2].get_data()))

Вот вывод:

Kitchen Fridge:
{'Name': 'Water Heater Switch', 'State': 'off', 'temp': 2, 'Type': 'Smart Switch'}
-----

Water Heater Switch:
{'Name': 'Water Heater Switch', 'State': 'off', 'temp': 2, 'Type': 'Smart Switch'}
-----

Переключатель водонагревателя полностью переопределяет данные холодильника.

Вот код для классов, которые я использую:

Устройство:

class Device:
    data = {"Name": None, "State": "off"}

    def __init__(self, name, state=None):
        self.data["Name"] = name
        if state is not None:
            self.data["State"] = state
        super().__init__()

    def get_data(self):
        return self.data

    def set_name(self, name):
        self.data["Name"] = name
        return self.get_data()

    def set_state(self, state):
        self.data["State"] = state
        return self.get_data()

SmartSwitch:

from Device import Device as Parent, Device
class SmartSwitch(Device):
    def __init__(self, name):
        super().__init__(name)
        self.data["Type"] = "Smart Switch"

Холодильник:

from Device import Device


class Refrigerator(Device):
    def __init__(self, name, temp=None):
        super().__init__(name)
        if temp is not None:
            self.data["temp"] = temp
        self.data["Type"] = "Refrigerator"

    def set_temperature(self, temp):
        self.data["temp"] = int(temp)
        return self.get_data()

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Проблема в том, что существует только один data dict, который находится в области видимости класса Device. Вы можете переместить data в метод __init__, но на самом деле вы должны использовать атрибуты в первую очередь. Чтобы получить все пары атрибут-значение объекта, используйте его специальный атрибут __dict__.

Кроме того, вам не нужны методы получения и установки в Python, и вы не нужно super().__init__() в классе, в котором нет родителей.

Поэтому код должен выглядеть следующим образом:

class Device:
    def __init__(self, name, state="off"):
        self.name = name
        self.state = state

class SmartSwitch(Device):
    def __init__(self, name):
        super().__init__(name)
        self.type = "Smart Switch"

class Refrigerator(Device):
    def __init__(self, name, temperature=None):
        super().__init__(name)
        self.temperature = temperature
        self.type = "Refrigerator"

devices = {}
devices["Kitchen Fridge"] = Refrigerator("Kitchen Fridge", 2)
devices["Water Heater Switch"] = SmartSwitch("Water Heater Switch")
for device_name, device in devices.items():
    print(device_name)
    print(device.__dict__)

Вывод:

Kitchen Fridge
{'name': 'Kitchen Fridge', 'state': 'off', 'type': 'Refrigerator', 'temperature': 2}
Water Heater Switch
{'name': 'Water Heater Switch', 'state': 'off', 'type': 'Smart Switch'}

I также изменено temp на temperature, чтобы избежать путаницы с "временным".

0 голосов
/ 29 января 2020

Поэтому я исправил проблему, добавив экземпляр dict data = {"Name": None, "State": "off"} к каждому из дочерних классов.

например

class SmartSwitch(Device):
    data = {"Name": None, "State": "off"}
    def __init__(self, name):
        super().__init__(name)
        self.data["Type"] = "Smart Switch"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...