I read today 2 methods regarding the customizing the attribute access:__getattr__ and __getattribute__ from https://docs.python.org/3/reference/datamodel.html#special-method-names. What I understood about them is that __getattr__ is called when the requested attribute is not found, and an AttributeError is raised. But later is called everytime unconditionally. I wrote a simple 2 input calculator program, where only 2 operations are permitted Addition and Subtraction. Anything else will cause an not permitted error.

class OperationNotPermitted(AttributeError):
    pass

class Calc:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __getattr__(self, name):
        if name == "sum":
            return self.x + self.y
        elif name == 'minus':
            return self.x - self.y
        else:
            raise OperationNotPermitted("operation {} is not permitted".format(name))

And here is a run down:

from customize_attr_access import *
cal = Calc(12, 10)
cal.sum
22
cal.minus
2
cal.mul
Traceback (most recent call last):
  Python Shell, prompt 5, line 1
    # Used internally for debug sandbox under external interpreter
  File "/Users/aruprakshit/python_playground/customize_attr_access.py", line 15, in __getattr__     raise OperationNotPermitted("operation {} is not permitted".format(name))
customize_attr_access.OperationNotPermitted: operation mul is not permitted

If I replace __getattr__ with __getattribute__ I found the program works exactly same. Now my questions is in real world when  you have to pick between these 2 pair of special method which protocols a Python dev checks to pick either of the one? Is there any such thing, or either one is fine. Can anyone elaborate this to educate me please?

doc said:

> This method should either return the (computed) attribute value or raise an AttributeError exception.

Another question:

My question is that: Can I raise a domain error like OperationNotPermitted when raising instead of AttributeError ?

--
Thanks,

Arup Rakshit

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to