Cannot access member variable using abc module and properties in python
Question: I wrote a code that simulates the use of `abc` module and `properties`.
However, it seems that I couldn't be able to access `width` and `height`
variables. The code is as the following:

    
    
    from abc import ABCMeta, abstractmethod
    
    class Polygon:
    
    __metaclass__ = ABCMeta
    
    @abstractmethod
    def compute_area(self): pass
    
    
    def __init__(self):
        self.width = None
        self.height = None
    
    @property
    def width_prop(self):
        return self.width
    
    @property
    def height_prop(self):
        return self.height
    
    @width_setter.setter
    def width_setter(self, width):
        self.width = width
    
    @height_setter.setter
    def height_setter(self, height):
        self.height = height
    
    
    
    class Triangle(Polygon):
        def compute_area(self):
            return 0.5 * width * height
    
    
    
    
    if __name__ == "__main__":
        tri = Triangle()
        tri.height_setter(20)
        tri.width_setter(30)
        print "Area of the triangle = ", tri.compute_area()
    

The error message that I obtained is `NameError: name 'width_setter' is not
defined`. What could be wrong in my implementation?

EDIT:

    
    
    from abc import ABCMeta, abstractmethod
    
    class Polygon:
    
    __metaclass__ = ABCMeta
    
    @abstractmethod
    def compute_area(self): pass
    
    
    def __init__(self):
        self.width = None
        self.height = None
    
    @property
    def width_prop(self):
        return self.width
    
    @width_prop.setter
    def width_setter(self, width):
        self.width = width
    
    @property
    def height_prop(self):
        return self.height
    
    @height_prop.setter
    def height_setter(self, height):
        self.height = height
    
    
    
    class Triangle(Polygon):
        def compute_area(self):
            return 0.5 * self.width * self.height
    
    
    
    
    if __name__ == "__main__":
        tri = Triangle()
        tri.height_prop = 20
        tri.width_prop = 30
        print "Area of the triangle = ", tri.compute_area()
    


Answer: Write Python as Python, not as C++ or Java:

    
    
    class Polygon:
        def compute_area(self):             # if you need this at all...
            raise NotImplementedError()     # what does it do for you?
    
        def __init__(self):
            self.width = None
            self.height = None
    
    class Triangle(Polygon):
        def compute_area(self):
            return 0.5 * self.width * self.height
    
    if __name__ == "__main__":
        tri = Triangle()
        tri.height = 20
        tri.width = 30
        print "Area of the triangle = ", tri.compute_area()
    

