Python class property and class constants -
i'm trying work "getters" , "setters" in python classes. have simple rectangle class defined below each rectangle object has class variables length , width defined. there class constant called sides knows number of sides of particular shape. now, when run class, works fine. can like
>>> rect = rectangle(2,3) >>> rect.length 2 >>> rect.width 3 however, if try have print out class constant sides, returns this
>>> rect.sides <property object @ 0x037f6c90> rather returning value 4. how can return value? on potentially related note, tried having property method sides variable defined such
@property def sides(self):     return self._sides this works other object variables, when attempt access sides through method, error saying rectangle has no attribute _sides. reference sides self.__class__.sides proper?
rectangle class
import abc shape import shape  class rectangle(shape):      sides = 4      def __init__(self, length, width):         super().__init__('rectangle')         self.length = length         self.width = width      #the getters     @property     def sides(self):         return self.__class__.sides      @property     def length(self):         return self._length      @property     def width(self):         return self._width      #the setters      @sides.setter     def sides(self, value):         if value != 4:             raise valueerror('error: cannot set number of sides value '                              'other 4.')         self._sides = value      @length.setter     def length(self, value):         if value <= 0:             raise valueerror('error: length must positive.')         self._length = value      @width.setter     def width(self, value):         if value <= 0:             raise valueerror('error: width must positive.')         self._width = value        def getarea(self):         return self.length * self.width 
you should -
#the getters @property def sides(self):     return self.__class__._sides instead of -
#the getters @property def sides(self):     return self.__class__.sides notice _sides
also, @ start of class think wanted initialize _sides instead of sides.
you need use different name sides because sides used refer class property, if try return self.__class__.sides directly return property object, can use type(rect.sides) in example , not work, check type is. 
also, note, instead of self.__class__.sides , if return self.sides , inside getter function, keep on recursively calling getter function causing python error out - 
runtimeerror: maximum recursion depth exceeded while calling python object
Comments
Post a Comment