【问题标题】:two classes with similar attributes except one of the attributes is different两个具有相似属性的类,但其中一个属性不同
【发布时间】:2020-03-28 15:34:34
【问题描述】:
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。

我觉得我的代码不好(我是一周前开始编程的新手)

在这种情况下使用两个类可以吗?如果不是解决方案是什么(仍然使用 OOP,因为我需要练习)

【问题讨论】:

    标签: python class oop attributes instance


    【解决方案1】:

    您可以将公共部分移动到一个公共父类中:

    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
    

    【讨论】:

    • 非常感谢。 super().__init__.可以用 Transport.__init__ 代替吗?我就是这么学的,所以我想了解它是否相同
    • 可以的。如果您决定重命名父类,则使用 super() 不太容易出错。
    【解决方案2】:

    既然你想学习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
    

    Customclass 正在完成所有工作,方法是将其在 init() 中接收到的所有参数相加。您可以调用此类提供要求和的值:Custom(100,50,25).rate_for_custom() 另外两个类AirSea继承自Customclass,只是一个接口。使用它们可以让您使用关键字参数而不是简单的参数:Sea(supplier=100,delivery=50,insurance=25,port_tax=25),这样更友好。

    【讨论】:

    • *自定义类中的args将保存为列表?
    • @liamlasry *args 对应于元组中的类参数,因此就像一个列表但不可变(如果您愿意,不可更改)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2023-02-14
    • 2018-01-01
    • 1970-01-01
    相关资源
    最近更新 更多