Python: управление несколькими классами (из сериализации) с общими свойствами - PullRequest
0 голосов
/ 12 октября 2018

Я новичок в структурировании проектов Python, поэтому, пожалуйста, простите любые неправильные подходы, которые могут быть записаны здесь.

Две схемы JSON представляют два объекта.Они сериализуются в классы и имеют общие свойства.

Пример:

class TwoWheelVeicle(object):
    def __init__(self,v_family, v_subfamily):
        self.Family = v_family
        self.SubFamily = v_subfamily
        self.OtherProp = "other"

class FourWheelVeicle(object):
    def __init__(self,v_family):
        self.Family = v_family
        self.AnotherProp = "another"


def run_an_highway(vehicle):

    if isinstance(vehicle,FourWheelVeicle):
        return "Wrooom"

    if isinstance(vehicle,TwoWheelVeicle):
        if veichle.SubFamily in SubFams.NotAllowed:
            return "ALT!"
        else:
            return "Brooom" #forgive me for the sound


class SubFams(object):
    NotAllowed = ["Bicycle","50cc"]
    Known = ["200cc","Motorbike"]

Я совершенно не уверен в процедуре в целом:- Должен ли я создать абстрактный родительский класс?- Правильно ли хранится NotAllowed?Это связано с необходимостью изменения его содержимого (которое сериализуется из некоторого глобального параметра JSON, это #TODO)

.. или просто я не хочу делать что-либо из этого?

Наконец, код не позволяет проверять правильность сериализованных мной свойств (что если SubFamily неизвестно? Должно ли оно быть проверено в декодере?).

Большое спасибо.

1 Ответ

0 голосов
/ 12 октября 2018

Похоже, вам следует абстрагировать транспортное средство с помощью класса Vehicle, а затем подклассировать его для разных типов транспортных средств.

Ваша цепочка if не нужна, если у ваших разных подклассов есть собственная версия для того же метода.

Что-то в соответствии с этим:

class Vehicle(object):
    def __init__(self, name, cc):
        self.name = name
        self.cc = cc
        self.wheels = None

    def runs_on_highway(self):
        return self.cc > 50

    def sound(self):
        pass

class TwoWheels(Vehicle):
    def __init__(self, name, cc):
        Vehicle.__init__(self, name, cc)
        self.wheels = 2

    def sound(self):
        return 'Brooom.'

class FourWheels(Vehicle):
    def __init__(self, name, cc):
        Vehicle.__init__(self, name, cc)
        self.wheels = 4

    def sound(self):
        return 'Vruuum'

class ElectricWheels(Vehicle):
    def __init__(self, name, cc):
        Vehicle.__init__(self, name, 0)
        self.wheels = 4

    def runs_on_highway(self):
        return True

    def sound(self):
        return 'zzzzz.'

v1 = TwoWheels('Bicycle', 50)
v2 = FourWheels('Motorbike', 200)
v3 = ElectricWheels('ElectricBike', 0)

print(v1.runs_on_highway())
print(v2.runs_on_highway())
print(v3.runs_on_highway())

print(v1.name, v1.cc, v1.wheels, v1.sound())
print(v2.name, v2.cc, v2.wheels, v2.sound())
print(v3.name, v3.cc, v3.wheels, v3.sound())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...