два класса с похожими атрибутами, за исключением того, что один из атрибутов отличается - PullRequest
0 голосов
/ 28 марта 2020
class Air:
    def __init__(self,supplier,delivery,ensurance):
        self.supplier = supplier
        self.delivery = delivery
        self.ensurance = ensurance
    def rate_for_custom(self):
        return (self.supplier + self.delivery + self.ensurance)
class Sea:
    def __init__(self,supplier,delivery,ensurance,port_tax):
        self.supplier = supplier
        self.delivery = delivery
        self.ensurance = ensurance
        self.port_tax = port_tax
    def rate_for_custom(self):
        return (self.supplier + self.delivery + self.ensurance + self.port_tax)

, поэтому я пытаюсь написать программу, которая рассчитывает налоги на импорт в Израиле.

Существует два типа: один в море и один в воздухе

они оба имеют одни и те же атрибуты, за исключением того, что Sea должен быть рассчитан с другим атрибутом.

Я чувствую, что мой код нехорош (я новичок в программировании, начавшемся неделю a go)

нормально ли использовать два класса в этом случае? если нет, то каково решение (по-прежнему используя OOP, потому что мне нужно попрактиковаться с ним)

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Если вы хотите выучить OOP, тогда вы можете начать понимать концепцию наследования. Вот пример:


# generic class
class Custom:
    def __init__(self,*args):
        # collect all given parameters:
        self.args = args

    def rate_for_custom(self):
        # just sum all numbers in given parameter:
        return sum(self.args)

class Sea(Custom):
    def __init__(self,supplier=0,delivery=0,insurance=0, port_tax = 0):
        # Call Custom class and provide all relevant parameters:
        super().__init__(supplier, delivery, insurance, port_tax) 


class Air(Custom):
    def __init__(self,supplier=0, delivery=0, insurance=0):
        # Call Custom class and provide all relevant parameters:
        super().__init__(supplier, delivery, insurance )        


print(Custom(100,50,25).rate_for_custom())
# 175

print(Air(supplier=100,delivery=50,insurance=25).rate_for_custom())
# 175

print(Sea(supplier=100,delivery=50,insurance=25,port_tax=25).rate_for_custom())
# 200

Custom класс выполняет всю работу, суммируя все параметры, которые он получает в init (). Вы можете вызвать этот класс, предоставив значения для суммирования: Custom(100,50,25).rate_for_custom() Два других класса Air и Sea наследуются от класса Custom и являются просто интерфейсом. Используя их, вы можете использовать ключевые аргументы вместо простых аргументов: Sea(supplier=100,delivery=50,insurance=25,port_tax=25), что более удобно.

1 голос
/ 28 марта 2020

Вы можете переместить общие части в общий родительский класс:

class Transport:
    def __init__(self,supplier,delivery,ensurance):
        self.supplier = supplier
        self.delivery = delivery
        self.ensurance = ensurance
    def rate_for_custom(self):
        return (self.supplier + self.delivery + self.ensurance)

class Air(Transport):
    pass

class Sea(Transport):
    def __init__(self,supplier,delivery,ensurance,port_tax):
        super().__init__(supplier, delivery, ensurance)
        self.port_tax = port_tax
    def rate_for_custom(self):
        return super().rate_for_custom() + self.port_tax
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...