From CS 61A Wiki
Revision as of 14:33, 24 July 2014 by Axis (Talk | contribs)

Jump to: navigation, search

An attribute of an object is a piece of data that describes the object, stored within the object as a key-value pair. Given an object, one can ask for the value of an attribute using dot notation.

>>> object.attribute

Class attribute

A class attribute is shared by all instances of a class. Class attributes are defined within the class but outside of methods.

They can be accessed by the class or by instances of the class: A.attr or obj.attr, where A is the class and obj is an instance of the class. Example:

>>> class A:
...     class_attribute = 5
>>> A.class_attribute
>>> inst = A()
>>> inst.class_attribute

Instance attribute

An instance attribute is specific to one instance of a class. Instance attributes are typically defined inside methods. Example:

class A:
    def __init__(self):
        self.x = 1 # x is an instance attribute
>>> a = A()
>>> a.x

If a class attribute and instance attribute have the same name, then the instance attribute will hide the class attribute. The instance can access only the instance attribute, although the class can still access the class attribute. Example:

>>> class A:
        num = 0
        def __init__(self):
            self.num = 1
>>> A.num
>>> inst1 = A()
>>> inst1.num


A method is an instance attribute that is a function that manipulates the object. A method can be invoked on an object in two ways:

  • A.method(obj, arg), where A is a class and obj is the object. A.method is a normal function.
  • obj.method(arg), where obj is the object. obj.method is called a bound method because it has an object attached to it. The object is automatically passed into the method as the first argument (usually self).
class A:
    def __init__(self, id): = id
    def get_id(self):
>>> a = A(6)
>>> A.get_id
<function A.get_id at 0x...>
>>> a.get_id
<bound method A.get_id of <__main__.A object at 0x...>>
>>> A.get_id(a)
>>> a.get_id()

Attribute assignment

Attributes can be assigned to by using dot notation and an equals sign.

Example of assigning a class attribute:

>>> class A:
...     class_attribute = 5
>>> A.class_attribute
>>> A.class_attribute = 6
>>> A.class_attribute

Example of assigning an instance attribute:

class A:
    def __init__(self):
        self.x = 1
>>> a = A()
>>> a.x
>>> a.x = 2
>>> a.x

Assigning to methods

To assign to a method for the entire class:

A.method = lambda self: ret_value

To assign to a method for an instance:

inst.method = lambda: ret_value


>>> class A:
...     def __init__(self, x):
...         self.x = x
>>> A.prev = lambda self: self.x - 1 # add a method for the class
>>> a = A(1)
>>> a.prev()
>>> = lambda: a.x + 1 # add a method for object 'a'


@property is a shorthand way to create getter and setter methods. Putting @property above a method allows it to be accessed as if it were an instance variable.

Sometimes we have a value that can be computed by accessing other instance variables. Instead of defining a new instance variable (which would then have to be modified each time we change an existing instance variable), we simply make a property.[1]


class Square:
    def __init__(self, side_length):
        self._length = side_length # leading underscore indicates that this attribute is only for internal use
    def area(self):
        return self._length ** 2
    def area(self, value):
        self._length = value ** (1/2)
>>> sq = Square(5.0)

Because area is a property method, it can be accessed by sq.area instead of sq.area():

>>> sq.area

The second area method is marked as a setter method for the property area, so it is called when we use attribute assignment:

>>> sq.area = 9.0
>>> sq.area
>>> sq._length


When one tries to access a nonexistent attribute of an object, Python will raise an AttributeError: 'type_of_obj' object has no attribute 'key'.

This error commonly occurs when the object to the left of the dot is None. Example:

>>> obj = None
>>> obj.a()
Traceback (most recent call last):
AttributeError: 'NoneType' object has no attribute 'a'

Naming conventions[2]

  • _single_leading_underscore indicates that the attribute should be only be used internally by the object.
  • __double_leading_and_trailing__underscores__ denote magic methods, built-in attributes in Python that have a particular meaning beyond just holding a key-value pair.


In a Python functional implementation of object-oriented programming, attributes can be modeled as a local dictionary within the object frame[3], because attributes are just key-value pairs belonging to the object.

>>> # From Section 2.6.1 of Composing Programs by John DeNero (see citation above)
>>> def make_instance(cls):
        """Return a new object instance, which is a dispatch dictionary."""
        def get_value(name):
            if name in attributes:
                return attributes[name]
                value = cls['get'](name)
                return bind_method(value, instance)
        def set_value(name, value):
            attributes[name] = value
        attributes = {}
        instance = {'get': get_value, 'set': set_value}
        return instance


  2. PEP 8 Style Guide for Python Code
  3. Implementation of attributes in Python