@property
decoratorimport iso6346
class ShippingContainer:
next_serial = 1337 # lolz
@staticmethod
def _make_bic_code(owner_code, serial):
return iso6346.create(
owner_code=owner_code,
serial=str(serial).zfill(6)
)
@classmethod
def _get_next_serial(cls):
result = cls.next_serial
cls.next_serial += 1
return result
@classmethod
def create_empty(cls, owner_code, *args, **kwargs):
return cls(owner_code, contents=None, *args, **kwargs)
@classmethod
def create_with_items(cls, owner_code, items, *args, **kwargs):
return cls(owner_code, contents=list(items), *args, **kwargs)
def __init__(self, owner_code, contents):
self.contents = contents
self.bic = self._make_bic_code(
owner_code=owner_code,
serial=ShippingContainer._get_next_serial()
)
class RefrigeratedShippingContainer(ShippingContainer):
MAX_CELSIUS = 4.0
@staticmethod
def _make_bic_code(owner_code, serial):
return iso6346.create(
owner_code=owner_code,
serial=str(serial).zfill(6),
category='R'
)
def __init__(self, owner_code, contents, celsius):
super().__init__(owner_code, contents)
if celsius > RefrigeratedShippingContainer.MAX_CELSIUS:
raise ValueError("Temperature too hot!")
self._celsius = celsius
@property # celsius getter
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
import iso6346
class ShippingContainer:
next_serial = 1337 # lolz
@staticmethod
def _make_bic_code(owner_code, serial):
return iso6346.create(
owner_code=owner_code,
serial=str(serial).zfill(6)
)
@classmethod
def _get_next_serial(cls):
result = cls.next_serial
cls.next_serial += 1
return result
@classmethod
def create_empty(cls, owner_code, *args, **kwargs):
return cls(owner_code, contents=None, *args, **kwargs)
@classmethod
def create_with_items(cls, owner_code, items, *args, **kwargs):
return cls(owner_code, contents=list(items), *args, **kwargs)
def __init__(self, owner_code, contents):
self.contents = contents
self.bic = self._make_bic_code(
owner_code=owner_code,
serial=ShippingContainer._get_next_serial()
)
class RefrigeratedShippingContainer(ShippingContainer):
MAX_CELSIUS = 4.0
@staticmethod
def _make_bic_code(owner_code, serial):
return iso6346.create(
owner_code=owner_code,
serial=str(serial).zfill(6),
category='R'
)
@staticmethod
def _c_to_f(celsius):
return celsius * 9/5 + 32
@staticmethod
def _f_to_c(fahrenheit):
return (fahrenheit - 32) * 5/9
def __init__(self, owner_code, contents, celsius):
super().__init__(owner_code, contents)
self.celsius = celsius
@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
@property
def fahrenheit(self):
return RefrigeratedShippingContainer._c_to_f(self.celsius)
@fahrenheit.setter
def fahrenheit(self, value):
self.celsius = RefrigeratedShippingContainer._f_to_c(value)
@property
decoratorimport iso6346
class ShippingContainer:
HEIGHT_FT = 8.5
WIDTH_FT = 8.0
next_serial = 1337
@staticmethod
def _make_bic_code(owner_code, serial):
return iso6346.create(
owner_code=owner_code,
serial=str(serial).zfill(6)
)
@classmethod
def _get_next_serial(cls):
result = cls.next_serial
cls.next_serial += 1
return result
@classmethod
def create_empty(cls, owner_code, length_ft *args, **kwargs):
return cls(owner_code, length_ft, contents=None, *args, **kwargs)
@classmethod
def create_with_items(cls, owner_code, length_ft items, *args, **kwargs):
return cls(owner_code, length_ft, contents=list(items), *args, **kwargs)
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()
)
@property
def volume_in_cubic_feet(self):
return ShippingContainer.HEIGHT_FT * ShippingContainer.WIDTH_FT * self.length_ft
class RefrigeratedShippingContainer(ShippingContainer):
MAX_CELSIUS = 4.0
FRIDGE_VOLUME_IN_CUBIC_FEET = 100
@staticmethod
def _make_bic_code(owner_code, serial):
return iso6346.create(
owner_code=owner_code,
serial=str(serial).zfill(6),
category='R'
)
@staticmethod
def _c_to_f(celsius):
return celsius * 9/5 + 32
@staticmethod
def _f_to_c(fahrenheit):
return (fahrenheit - 32) * 5/9
def __init__(self, owner_code, length_ft, contents, celsius):
super().__init__(owner_code, length_ft, contents)
self.celsius = celsius
@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
@property
def fahrenheit(self):
return RefrigeratedShippingContainer._c_to_f(self.celsius)
@fahrenheit.setter
def fahrenheit(self, value):
self.celsius = RefrigeratedShippingContainer._f_to_c(value)
@property
def volume_in_cubic_feet(self):
return super().volume_in_cubic_feet - RefrigeratedShippingContainer.FRIDGE_VOLUME_IN_CUBIC_FEET
import iso6346
class ShippingContainer:
HEIGHT_FT = 8.5
WIDTH_FT = 8.0
next_serial = 1337
@staticmethod
def _make_bic_code(owner_code, serial):
return iso6346.create(
owner_code=owner_code,
serial=str(serial).zfill(6)
)
@classmethod
def _get_next_serial(cls):
result = cls.next_serial
cls.next_serial += 1
return result
@classmethod
def create_empty(cls, owner_code, length_ft *args, **kwargs):
return cls(owner_code, length_ft, contents=None, *args, **kwargs)
@classmethod
def create_with_items(cls, owner_code, length_ft items, *args, **kwargs):
return cls(owner_code, length_ft, contents=list(items), *args, **kwargs)
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()
)
@property
def volume_in_cubic_feet(self):
return ShippingContainer.HEIGHT_FT * ShippingContainer.WIDTH_FT * self.length_ft
class RefrigeratedShippingContainer(ShippingContainer):
MAX_CELSIUS = 4.0
FRIDGE_VOLUME_IN_CUBIC_FEET = 100
@staticmethod
def _make_bic_code(owner_code, serial):
return iso6346.create(
owner_code=owner_code,
serial=str(serial).zfill(6),
category='R'
)
@staticmethod
def _c_to_f(celsius):
return celsius * 9/5 + 32
@staticmethod
def _f_to_c(fahrenheit):
return (fahrenheit - 32) * 5/9
def __init__(self, owner_code, length_ft, contents, celsius):
super().__init__(owner_code, length_ft, contents)
self.celsius = celsius
@property
def celsius(self):
return self._celsius
@celsius.setter
def celsius(self, value):
if value > RefrigeratedShippingContainer.MAX_CELSIUS:
raise ValueError(f"Temperature of {value} is too hot!")
self._celsius = value
@property
def fahrenheit(self):
return RefrigeratedShippingContainer._c_to_f(self.celsius)
@fahrenheit.setter
def fahrenheit(self, value):
self.celsius = RefrigeratedShippingContainer._f_to_c(value)
@property
def volume_in_cubic_feet(self):
return super().volume_in_cubic_feet - RefrigeratedShippingContainer.FRIDGE_VOLUME_IN_CUBIC_FEET
class HeatedRefrigeratedShippingContainer(RefrigeratedShippingContainer):
MIN_CELSIUS = -20.0
@RefrigeratedShippingContainer.celsius.setter
def celsius(self, value):
if not (HeatedRefrigeratedShippingContainer.MIN_CELSIUS
<= value
<= RefrigeratedShippingContainer.MAX_CELSIUS):
raise ValueError(f"Temperature {value} is out of range!")
self._celsius = value
Aside - chained relational operators Python allows for chaining relational operators, so that one can write
a < b < c
in place of(a < b) and (b < c)
class HeatedRefrigeratedShippingContainer(RefrigeratedShippingContainer):
MIN_CELSIUS = -20.0
# NOTE: this doesn't work
@RefrigeratedShippingContainer.celsius.setter
def celsius(self, value):
if value < HeatedRefrigeratedShippingContainer.MIN_CELSIUS:
raise ValueError(f"Temperature {value} is out of range!")
super().celsius = value # throws AttributeError: 'super' object has no attribute 'celsius'
# This works
@RefrigeratedShippingContainer.celsius.setter
def celsius(self, value):
if value < HeatedRefrigeratedShippingContainer.MIN_CELSIUS:
raise ValueError(f"Temperature {value} is out of range!")
RefrigeratedShippingContainer.celsius.fset(self, value)