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

Arup Rakshit ar at zeit.io
Tue Mar 19 11:09:22 EDT 2019


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






More information about the Python-list mailing list