osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Why can't access the property setter using the super?


I have 3 classes which are connected to them through inheritance as you see in the below code:

import iso6346

class ShippingContainer:
    """docstring for ShippingContainer"""

    HEIGHT_FT = 8.5
    WIDTH_FT = 8.0
    next_serial = 1337

    @classmethod
    def _get_next_serial(cls):
        result = cls.next_serial
        cls.next_serial += 1
        return result

    @staticmethod
    def _make_bic_code(owner_code, serial):
        return iso6346.create(owner_code=owner_code,
                              serial=str(serial).zfill(6))

    @classmethod
    def create_empty(cls, owner_code, length_ft, *args, **keyword_args):
        return cls(owner_code, length_ft, contents=None, *args, **keyword_args)

    # ... skipped

    def __init__(self, owner_code, length_ft, contents):
        self.contents  = contents
        self.length_ft = length_ft
        self.bic = self._make_bic_code(owner_code=owner_code,
                                      serial=ShippingContainer._get_next_serial())
        # ... skipped


class RefrigeratedShippingContainer(ShippingContainer):
    MAX_CELSIUS = 4.0
    FRIDGE_VOLUME_FT3 = 100

    def __init__(self, owner_code, length_ft, contents, celsius):
        super().__init__(owner_code, length_ft, contents)
        self.celsius = celsius

    # ... skipped

    @staticmethod
    def _make_bic_code(owner_code, serial):
        return iso6346.create(owner_code=owner_code,
                              serial=str(serial).zfill(6),
                              category='R')
    @property
    def celsius(self):
        return self._celsius

    @celsius.setter
    def celsius(self, value):
        if value > RefrigeratedShippingContainer.MAX_CELSIUS:
            raise ValueError("Temperature too hot!")
        self._celsius = value

    # ... skipped


class HeatedRefrigeratedShippingContainer(RefrigeratedShippingContainer):
    MIN_CELSIUS = -20.0

    @RefrigeratedShippingContainer.celsius.setter
    def celsius(self, value):
        if value < HeatedRefrigeratedShippingContainer.MIN_CELSIUS:
            raise ValueError("Temperature too cold!")
        super().celsius = value




Now when I run the code :

Python 3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from shipping import *                                        >>> h1 = HeatedRefrigeratedShippingContainer.create_empty('YML', length_ft=40, celsius=-18)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/aruprakshit/python_playground/shipping.py", line 23, in create_empty
    return cls(owner_code, length_ft, contents=None, *args, **keyword_args)
  File "/Users/aruprakshit/python_playground/shipping.py", line 47, in __init__
    self.celsius = celsius
  File "/Users/aruprakshit/python_playground/shipping.py", line 92, in celsius
    super().celsius = value
AttributeError: 'super' object has no attribute 'celsius'
>>> 


Why here super is denying the fact that it has no celsius setter, although it has. While this code doesn?t work how can I solve this. The thing I am trying here not to duplicate the validation of temperature which is already in the  setter property of the RefrigeratedShippingContainer class.




Thanks,

Arup Rakshit
ar at zeit.io