AttributeError


what causes AttributeError?

AttributeError is raised when there is a reference to a name that is NOT in an object that exists.


what is an attribute?

An attribute is a name for something that belongs to an object, for example, a human being has attributes like height, weight, sex and color. They are also known as properties


preview

Here are the tests I have by the end of the chapter

 1import unittest
 2import src.attribute_error
 3
 4
 5class TestAttributeError(unittest.TestCase):
 6
 7    def test_attribute_error_w_variables(self):
 8        src.attribute_error.variable_00
 9        src.attribute_error.variable_01
10        src.attribute_error.variable_02
11        src.attribute_error.variable_03
12
13    def test_attribute_error_w_functions(self):
14        src.attribute_error.function_00()
15        src.attribute_error.function_01()
16        src.attribute_error.function_02()
17        src.attribute_error.function_03()
18
19    def test_attribute_error_w_class_attributes(self):
20        src.attribute_error.AClass.attribute_00
21        src.attribute_error.AClass.attribute_01
22        src.attribute_error.AClass.attribute_02
23        src.attribute_error.AClass.attribute_03
24
25    def test_attribute_error_w_class_methods(self):
26        src.attribute_error.AClass.method_00()
27        src.attribute_error.AClass.method_01()
28        src.attribute_error.AClass.method_02()
29        src.attribute_error.AClass.method_03()
30
31
32# Exceptions seen
33# AssertionError
34# AttributeError
35# NameError
36# TypeError
37# SyntaxError

start the project

test_attribute_error_w_variables

RED: make it fail

  • I add an import statement at the top of test_attribute_error.py

    1import unittest
    2import src.attribute_error
    
  • I change test_failure to test_attribute_error_w_variables

     5class TestAttributeError(unittest.TestCase):
     6
     7    def test_attribute_error_w_variables(self):
     8        src.attribute_error.variable_00
     9
    10
    11# Exceptions seen
    

    I think of src.attribute_error.variable_00 as an address for variable_00 in attribute_error.py which is in the src folder. Since the file is empty, the variable is not in it.

    The terminal shows AttributeError

    AttributeError: module 'src.attribute_error' has no attribute 'variable_00'
    
  • I add the error to the list of Exceptions seen in test_attribute_error.py

    11# Exceptions seen
    12# AssertionError
    13# AttributeError
    

GREEN: make it pass

  • I open attribute_error.py from the src folder in the editor of my Integrated Development Environment (IDE), then I add a name

    1variable_00
    

    the terminal shows NameError

    NameError: name 'variable_00' is not defined
    
  • I add it to the list of Exceptions seen in test_attribute_error.py

    11# Exceptions seen
    12# AssertionError
    13# AttributeError
    14# NameError
    
  • I point variable_00 to None in attribute_error.py

    1variable_00 = None
    

    the test passes. variable_00 is now an attribute/property of attribute_error.py which is in the src folder and I can reach it by using src.attribute_error.variable_00

REFACTOR: make it better

  • I do the same test a few more times as a drill in test_attribute_error.py

    7    def test_attribute_error_w_variables(self):
    8        src.attribute_error.variable_00
    9        src.attribute_error.variable_01
    

    the terminal shows AttributeError

    AttributeError: module 'src.attribute_error' has no attribute 'variable_01'. Did you mean: 'variable_00'?
    
  • I add the name to attribute_error.py

    1variable_00 = None
    2variable_01
    

    the terminal shows NameError

    NameError: name 'variable_01' is not defined
    

    I point it to None

    1variable_00 = None
    2variable_01 = None
    

    the test passes

  • I another statement to test_attribute_error.py

     7    def test_attribute_error_w_variables(self):
     8        src.attribute_error.variable_00
     9        src.attribute_error.variable_01
    10        src.attribute_error.variable_02
    

    the terminal shows AttributeError

    AttributeError: module 'src.attribute_error' has no attribute 'variable_02'. Did you mean: 'variable_00'?
    
  • I add the name and point it to None

    1variable_00 = None
    2variable_01 = None
    3variable_02 = None
    

    the test passes

  • one more line in test_attribute_error.py

     7    def test_attribute_error_w_variables(self):
     8        src.attribute_error.variable_00
     9        src.attribute_error.variable_01
    10        src.attribute_error.variable_02
    11        src.attribute_error.variable_03
    

    the terminal shows AttributeError

    AttributeError: module 'src.attribute_error' has no attribute 'variable_03'. Did you mean: 'variable_00'?
    
  • I add the attribute to attribute_error.py

    1variable_00 = None
    2variable_01 = None
    3variable_02 = None
    4variable_03 = None
    

    the test passes

A variable in a module is an attribute of the module


test_attribute_error_w_functions

RED: make it fail

I add a new test to test_attribute_error.py

11        src.attribute_error.variable_03
12
13    def test_attribute_error_w_functions(self):
14        src.attribute_error.function_00()
15
16
17# Exceptions seen

the terminal shows AttributeError

AttributeError: module 'src.attribute_error' has no attribute 'function_00'

GREEN: make it pass

  • I add the name and point it to None in attribute_error.py

    4variable_03 = None
    5
    6
    7function_00 = None
    

    the terminal shows TypeError

    TypeError: 'NoneType' object is not callable
    
  • I add it to the list of Exceptions seen in test_attribute_error.py

    17# Exceptions seen
    18# AssertionError
    19# AttributeError
    20# NameError
    21# TypeError
    
  • I change the attribute to a function in attribute_error.py

    4variable_03 = None
    5
    6
    7def function_00():
    8    return None
    

    the test passes. function_00 is now an attribute/property of attribute_error.py which is in the src folder and I can call it by using src.attribute_error.function_00()

REFACTOR: make it better

  • time to do it as a drill, I add another call in test_attribute_error.py

    13    def test_attribute_error_w_functions(self):
    14        src.attribute_error.function_00()
    15        src.attribute_error.function_01()
    

    the terminal shows AttributeError

    AttributeError: module 'src.attribute_error' has no attribute 'function_01'. Did you mean: 'function_00'?
    
  • I add the function to attribute_error.py

     7def function_00():
     8    return None
     9
    10
    11def function_01():
    12    return None
    

    the test passes

  • I add another line to test_attribute_error.py

    13    def test_attribute_error_w_functions(self):
    14        src.attribute_error.function_00()
    15        src.attribute_error.function_01()
    16        src.attribute_error.function_02()
    

    the terminal shows AttributeError

    AttributeError: module 'src.attribute_error' has no attribute 'function_02'. Did you mean: 'function_00'?
    
  • I add a function for it in attribute_error.py

    11def function_01():
    12    return None
    13
    14
    15def function_02():
    16    return None
    

    the test passes

  • then I add another line in test_attribute_error.py

    13    def test_attribute_error_w_functions(self):
    14        src.attribute_error.function_00()
    15        src.attribute_error.function_01()
    16        src.attribute_error.function_02()
    17        src.attribute_error.function_03()
    18
    19
    20# Exceptions seen
    

    the terminal shows AttributeError

    AttributeError: module 'src.attribute_error' has no attribute 'function_03'. Did you mean: 'function_00'?
    
  • I add it the function to attribute_error.py

    15def function_02():
    16    return None
    17
    18
    19def function_03():
    20    return None
    

    the test passes

A function in a module is an attribute of the module


test_attribute_error_w_class_attributes

We know that variables and functions defined in a module are attributes. variables defined inside a class are also attributes.

RED: make it fail

I add a new test to test_attribute_error.py

        src.attribute_error.function_03()

    def test_attribute_error_w_class_attributes(self):
        src.attribute_error.AClass.attribute_00


# Exceptions seen

the terminal shows AttributeError

AttributeError: module 'src.attribute_error' has no attribute 'AClass'

GREEN: make it pass

  • I add a function to attribute_error.py

    15def function_03():
    16    return None
    17
    18
    19def AClass():
    20    return None
    

    the terminal shows AttributeError

    AttributeError: 'function' object has no attribute 'attribute_00'
    
  • I define a variable inside the function

    23def AClass():
    24
    25    attribute_00 = None
    26    return None
    

    the terminal still shows the same Exception because I cannot access a variable that belongs to a function from outside of the function

  • I use the class keyword instead of the def keyword to make AClass a class

    23class AClass():
    24
    25    attribute_00 = None
    26    return None
    

    the terminal shows SyntaxError

    E    return None
    E    ^^^^^^^^^^^
    E  SyntaxError: 'return' outside function
    
  • I add it to the list of Exceptions seen in test_attribute_error.py

    23# Exceptions seen
    24# AssertionError
    25# AttributeError
    26# NameError
    27# TypeError
    28# SyntaxError
    
  • I remove the return statement from AClass in attribute_error.py since it is no longer a function

    23class AClass():
    24    attribute_00 = None
    

    the test passes. attribute_00 is now an attribute/property of AClass which is an attribute/property of attribute_error.py which is in the src folder and I can reach it by using src.attribute_error.AClass.attribute_00()

REFACTOR: make it better

  • I add another failing line to test_attribute_error.py

    19    def test_attribute_error_w_class_attributes(self):
    20        src.attribute_error.AClass.attribute_00
    21        src.attribute_error.AClass.attribute_01
    

    the terminal shows AttributeError

    AttributeError: type object 'AClass' has no attribute 'attribute_01'. Did you mean: 'attribute_00'?
    
  • I add the name to the class definition in attribute_error.py

    23class AClass():
    24
    25    attribute_00 = None
    26    attribute_01 = None
    

    the test passes

  • I add another line to test_attribute_error.py

    19    def test_attribute_error_w_class_attributes(self):
    20        src.attribute_error.AClass.attribute_00
    21        src.attribute_error.AClass.attribute_01
    22        src.attribute_error.AClass.attribute_02
    

    the terminal shows AttributeError

    AttributeError: type object 'AClass' has no attribute 'attribute_02'. Did you mean: 'attribute_00'?
    
  • I add the attribute to AClass in attribute_error.py

    23class AClass():
    24
    25    attribute_00 = None
    26    attribute_01 = None
    27    attribute_02 = None
    

    the test passes

  • I add another line to test_attribute_error.py

    19    def test_attribute_error_w_class_attributes(self):
    20        src.attribute_error.AClass.attribute_00
    21        src.attribute_error.AClass.attribute_01
    22        src.attribute_error.AClass.attribute_02
    23        src.attribute_error.AClass.attribute_03
    24
    25
    26# Exceptions seen
    

    the terminal shows AttributeError

    AttributeError: type object 'AClass' has no attribute 'attribute_03'. Did you mean: 'attribute_00'?
    
  • I add the name to AClass in attribute_error.py

    23class AClass():
    24
    25    attribute_00 = None
    26    attribute_01 = None
    27    attribute_02 = None
    28    attribute_03 = None
    

    the test passes

  • A variable in a class in a module is an attribute of the class.

  • A class in a module is an attribute of the module


test_attribute_error_w_class_methods

We know that variables, functions and classes defined in a module are attributes. We also know that variables defined inside a class are attributes.

functions defined inside a class are also attributes, they are known as methods

RED: make it fail

  • I add a new test to test_attribute_error.py

    23        src.attribute_error.AClass.attribute_03
    24
    25    def test_attribute_error_w_class_methods(self):
    26        src.attribute_error.AClass.method_00()
    27
    28
    29# Exceptions seen
    

    the terminal shows AttributeError

    AttributeError: type object 'AClass' has no attribute 'method_00'
    

GREEN: make it pass

  • I add the name to AClass and point it to None in attribute_error.py

    23class AClass():
    24
    25    attribute_00 = None
    26    attribute_01 = None
    27    attribute_02 = None
    28    attribute_03 = None
    29
    30    method_00 = None
    

    the terminal shows TypeError

    TypeError: 'NoneType' object is not callable
    
  • I make it a method by using the def keyword

    28    attribute_03 = None
    29
    30    def method_00():
    31        return None
    

    the test passes. method_00 is now an attribute/property of AClass which is an attribute/property of attribute_error.py which is in the src folder and I can reach it by using src.attribute_error.AClass.method_00()

REFACTOR: make it better

  • You know the “drill”, I add a new failing line to test_attribute_error.py

    25    def test_attribute_error_w_class_methods(self):
    26        src.attribute_error.AClass.method_00()
    27        src.attribute_error.AClass.method_01()
    

    the terminal shows AttributeError

    AttributeError: type object 'AClass' has no attribute 'method_01'. Did you mean: 'method_00'?
    
  • I add a definition for it in attribute_error.py

    30    def method_00():
    31        return None
    32
    33    def method_01():
    34        return None
    

    the terminal shows green again

  • I add another failing line to test_attribute_error.py

    25    def test_attribute_error_w_class_methods(self):
    26        src.attribute_error.AClass.method_00()
    27        src.attribute_error.AClass.method_01()
    28        src.attribute_error.AClass.method_02()
    

    the terminal shows AttributeError

    AttributeError: type object 'AClass' has no attribute 'method_02'. Did you mean: 'method_00'?
    
  • I add the method to AClass in attribute_error.py

    33    def method_01():
    34        return None
    35
    36    def method_02():
    37        return None
    

    the test passes

  • I add the last line to test_attribute_error.py

    25    def test_attribute_error_w_class_methods(self):
    26        src.attribute_error.AClass.method_00()
    27        src.attribute_error.AClass.method_01()
    28        src.attribute_error.AClass.method_02()
    29        src.attribute_error.AClass.method_03()
    30
    31
    32# Exceptions seen
    

    the terminal shows AttributeError

    AttributeError: type object 'AClass' has no attribute 'method_03'. Did you mean: 'method_00'?
    
  • I add the method to AClass in attribute_error.py

    36    def method_02():
    37        return None
    38
    39    def method_03():
    40        return None
    

    the test passes

  • A function in a class is called a method and is an attribute of the class

  • A class in a module is an attribute of the module


close the project

  • I close the file(s) I have open in the editor(s)

  • I click in the terminal and exit the tests with ctrl+c on the keyboard

  • I deactivate the virtual environment

    deactivate
    

    the terminal goes back to the command line, (.venv) is no longer on the left side

    .../pumping_python/attribute_error
    
  • I change directory to the parent of attribute_error

    cd ..
    

    the terminal shows

    .../pumping_python
    

    I am back in the pumping_python directory


review

I ran tests for AttributeError with

I also saw the following Exceptions


code from the chapter

Do you want to see all the CODE I typed in this chapter?


what is next?

you made it to the end and know

do you think we can measure learning?


rate pumping python

If this has been a 7 star experience for you, please leave a 5 star review. It helps other people get into the book too