AttributeError with objects
test_attribute_error_w_variables and test_attribute_error_w_functions show that variables and functions in a module are attributes of the module.
Is an object in a module also an attribute of the module?
preview
I have these tests by the end of the chapter
open the project
I open a terminal
I change directory to the attribute_error folder in the
pumping_pythonfolderI open
test_attribute_error.pyfrom thetestsfolderI use pytest-watcher to run the tests automatically
the terminal is my friend, and shows
tests/test_attribute_error.py .. [100%] ================== 2 passed in D.EFs ===================
test_attribute_error_w_object_attributes
RED: make it fail
I go back to the terminal where the tests are running
I add a test for object attributes to
tests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: module 'src.attribute_error' has no attribute 'AnObject'
GREEN: make it pass
I open
__init__.pyfrom theattribute_errorfolder in thesrcfolderI add a function to
src/attribute_error/__init__.pythe terminal is my friend, and shows AttributeError
AttributeError: 'function' object has no attribute 'attribute_00'I add a variable for
attribute_00to the functionthe terminal still shows the same Exception because I cannot get to a variable inside a function from outside the function. The variable is only used inside the function when it runs.
I change
AnObjectfrom a function to an objectthe terminal is my friend, and shows SyntaxError
E return function_09() E ^^^^^^^^^^^^^^^^^^^^ E SyntaxError: 'return' outside functionbecause I cannot use a return statement outside a function.
I add SyntaxError to the list of Exceptions seen, in
tests/test_attribute_error.pyI comment out the return statement from
AnObjectinsrc/attribute_error/__init__.pythe test passes because
attribute_00is now an attribute/property of theAnObjectobjectAnObjectis an attribute of theattribute_errormodule in thesrcfolderI can use
attribute_00from outside the file withsrc.attribute_error.AnObject.attribute_00orsrc.attribute_error.AnObject().attribute_00src.attribute_error.AnObject.attribute_00 src.attribute_error.AnObject().attribute_00 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_00 = function_09()
REFACTOR: make it better
I remove the commented lines
I add a line for
src.attribute_error.AnObject().attribute_01totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'attribute_01'. Did you mean: 'attribute_00'?I add
attribute_01to the object definition insrc/attribute_error/__init__.pythe test passes because in this case it does not matter if I use the object (
AnObject) or an instance of the class (AnObject()).attribute_01is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_01orsrc.attribute_error.AnObject().attribute_01src.attribute_error.AnObject.attribute_01 src.attribute_error.AnObject().attribute_01 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_01 = attribute_00
I add a line for
src.attribute_error.AnObject.attribute_02totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: type object 'AnObject' has no attribute 'attribute_02'. Did you mean: 'attribute_00'?I add
attribute_02to the object definition insrc/attribute_error/__init__.pythe test passes because
attribute_02is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_02orsrc.attribute_error.AnObject().attribute_02src.attribute_error.AnObject.attribute_02 src.attribute_error.AnObject().attribute_02 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_02 = attribute_01I add a line for
src.attribute_error.AnObject().attribute_03totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'attribute_03'. Did you mean: 'attribute_00'?I add
attribute_03to the object definition insrc/attribute_error/__init__.pythe test passes because
attribute_03is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_03orsrc.attribute_error.AnObject().attribute_03src.attribute_error.AnObject.attribute_03 src.attribute_error.AnObject().attribute_03 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_03 = attribute_02I add a line for
src.attribute_error.AnObject.attribute_04totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: type object 'AnObject' has no attribute 'attribute_04'. Did you mean: 'attribute_00'?I add
attribute_04to the object definition insrc/attribute_error/__init__.pythe test passes because
attribute_04is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_04orsrc.attribute_error.AnObject().attribute_04src.attribute_error.AnObject.attribute_04 src.attribute_error.AnObject().attribute_04 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_04 = attribute_03I add a line for
src.attribute_error.AnObject().attribute_05totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'attribute_05'. Did you mean: 'attribute_00'?I add
attribute_05to the object definition insrc/attribute_error/__init__.pythe test passes because
attribute_05is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_05orsrc.attribute_error.AnObject().attribute_05src.attribute_error.AnObject.attribute_05 src.attribute_error.AnObject().attribute_05 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_05 = attribute_04I add a line for
src.attribute_error.AnObject().attribute_06totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'attribute_06'. Did you mean: 'attribute_00'?I add
attribute_06to the object definition insrc/attribute_error/__init__.pythe test passes because
attribute_06is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_06orsrc.attribute_error.AnObject().attribute_06src.attribute_error.AnObject.attribute_06 src.attribute_error.AnObject().attribute_06 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_06 = attribute_05I add a line for
src.attribute_error.AnObject.attribute_07totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: type object 'AnObject' has no attribute 'attribute_07'. Did you mean: 'attribute_00'?I add
attribute_07to the object definition insrc/attribute_error/__init__.pythe test passes because
attribute_07is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_07orsrc.attribute_error.AnObject().attribute_07src.attribute_error.AnObject.attribute_07 src.attribute_error.AnObject().attribute_07 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_07 = attribute_06I add a line for
src.attribute_error.AnObject.attribute_08totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: type object 'AnObject' has no attribute 'attribute_08'. Did you mean: 'attribute_00'?I add
attribute_08to the object definition insrc/attribute_error/__init__.pythe test passes because
attribute_08is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_08orsrc.attribute_error.AnObject().attribute_08src.attribute_error.AnObject.attribute_08 src.attribute_error.AnObject().attribute_08 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_08 = attribute_07I add a line for
src.attribute_error.AnObject().attribute_09totests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'attribute_09'. Did you mean: 'attribute_00'?I add
attribute_09to the object definition insrc/attribute_error/__init__.pythe test passes because
attribute_09is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can use it from outside the file withsrc.attribute_error.AnObject.attribute_09orsrc.attribute_error.AnObject().attribute_09src.attribute_error.AnObject.attribute_09 src.attribute_error.AnObject().attribute_09 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── attribute_09 = attribute_08
test_attribute_error_w_object_methods
The tests show that variables, functions and objects in a module are attributes of the module, and variables in an object are attributes of the class.
Methods of a class are also attributes of the class.
RED: make it fail
I go back to the terminal where the tests are running
I add a test for methods to
tests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: type object 'AnObject' has no attribute 'method_00'
GREEN: make it pass
I add the name to
AnObjectand point it toattribute_09, insrc/attribute_error/__init__.pythe terminal is my friend, and shows TypeError
TypeError: 'NoneType' object is not callablebecause
method_00isattribute_09,attribute_09is None, and I cannot call None like a function.I use the def keyword to change it from a variable (attribute) to a method
the terminal is my friend, and shows NameError
NameError: name 'attribute_09' is not definedbecause there is nothing inside
method_00namedattribute_09and it cannot get toattribute_09ofAnObject, yet.I add
self.before the name to reference the object attributethe terminal is my friend, and shows NameError
NameError: name 'self' is not definedI add
selfto the parentheses ofmethod_00the terminal is my friend, and shows TypeError
TypeError: AnObject.method_00() missing 1 required positional argument: 'self'because I called the method with the object not an instance of the class.
I use an instance of the class to call the method in
tests/test_attribute_error.pythe test passes because
method_00is now an attribute/property of theAnObjectobjectAnObjectis an attribute of theattribute_errormodule in thesrcfolderI can call
method_00from outside the file withsrc.attribute_error.AnObject().method_00()
src.attribute_error.AnObject().method_00 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── def method_00(self): └── return self.attribute_09
REFACTOR: make it better
I remove the commented lines from
src/attribute_error/__init__.pyI remove the commented line from
tests/test_attribute_error.pyYou know the “drill”, I add a call to
src.attribute_error.AnObject().method_01the terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_01'. Did you mean: 'method_00'?I add the method to the definition of
AnObjectinsrc/attribute_error/__init__.pythe test passes because
method_01is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can call it from outside the file withsrc.attribute_error.AnObject().method_01()src.attribute_error.AnObject().method_01 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── def method_01(self): └── return self.method_00()I add a call to
src.attribute_error.AnObject().method_02fromtests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_02'. Did you mean: 'method_00'?I add the method to the definition of
AnObjectinsrc/attribute_error/__init__.pythe test passes because
method_02is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can call it from outside the file withsrc.attribute_error.AnObject().method_02()src.attribute_error.AnObject().method_02 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── def method_02(self): └── return self.method_01()I add a call to
src.attribute_error.AnObject().method_03fromtests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_03'. Did you mean: 'method_00'?I add a method definition for
method_03to the definition ofAnObjectinsrc/attribute_error/__init__.pythe test passes because
method_03is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can call it from outside the file withsrc.attribute_error.AnObject().method_03()src.attribute_error.AnObject().method_03 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── def method_03(self): └── return self.method_02()I add a call to
src.attribute_error.AnObject().method_04fromtests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_04'. Did you mean: 'method_00'?I add a method definition for
method_04to the definition ofAnObjectinsrc/attribute_error/__init__.pythe test passes because
method_04is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can call it from outside the file withsrc.attribute_error.AnObject().method_04()src.attribute_error.AnObject().method_04 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── def method_04(self): return self.method_03()I add a call to
src.attribute_error.AnObject().method_05fromtests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_05'. Did you mean: 'method_00'?I add a method definition for
method_05to the definition ofAnObjectinsrc/attribute_error/__init__.pythe test passes.
I add a call to
src.attribute_error.AnObject().method_06fromtests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_06'. Did you mean: 'method_00'?I add a method definition for
method_06to the definition ofAnObjectinsrc/attribute_error/__init__.pythe test passes.
I add a call to
src.attribute_error.AnObject().method_07fromtests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_07'. Did you mean: 'method_00'?I add a method definition for
method_07to the definition ofAnObjectinsrc/attribute_error/__init__.pythe test passes.
I add a call to
src.attribute_error.AnObject().method_08fromtests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_08'. Did you mean: 'method_00'?I add a method definition for
method_08to the definition ofAnObjectinsrc/attribute_error/__init__.pythe test passes.
I add a call to
src.attribute_error.AnObject().method_09fromtests/test_attribute_error.pythe terminal is my friend, and shows AttributeError
AttributeError: 'AnObject' object has no attribute 'method_09'. Did you mean: 'method_00'?I add a method definition for
method_09to the definition ofAnObjectinsrc/attribute_error/__init__.pythe test passes because
method_09is now an attribute ofAnObjectinsrc/attribute_error/__init__.py, and I can call it from outside the file withsrc.attribute_error.AnObject().method_09()src.attribute_error.AnObject().method_09 └── src/ └── attribute_error/ └── __init__.py └── class AnObject(object): └── def method_09(self): └── return self.method_08()
A function in an object is an attribute of the class and is called a method
close the project
I close
src/attribute_error/__init__.pyandtests/test_attribute_error.pyI click in the terminal where the tests are running
I use q on the keyboard to leave the tests. The terminal goes back to the command line.
I change directory to the parent of
attribute_errorthe terminal shows
.../pumping_pythonI am back in the
pumping_pythondirectory.
review
All the tests I have run for AttributeError show that
I still have the problem that the tests all show the correct way to use attributes I made in src/attribute_error/__init__.py. If someone reads the file or runs it, there is no way for them to know how the code relates to AttributeError unless they go through the process with me, there has to be a better way.
code from the chapter
what is next?
rate pumping python
If this has been a 7 star experience for you, please CLICK HERE to leave a 5 star review of pumping python. It helps other people get into the book too.