36

I am learning python and doing an exercise about classes. It tells me to add an attribute to my class and a method to my class. I always thought these were the same thing until I read the exercise. What is the difference between the two?

3
  • 1
    For a class Foo, you call an attribute (a class variable) as Foo().bar. You call a method (a class function) as Foo().baz(). Commented Sep 20, 2017 at 3:13
  • Possible duplicate of Difference between calling a method and accessing an attribute Commented Nov 12, 2017 at 21:16
  • 1
    @pylang Without forgetting the static method Foo.wololo. Commented Aug 25, 2020 at 13:48

6 Answers 6

57

Terminology

Mental model:

  • A variable stored in an instance or class is called an attribute.
  • A function stored in an instance or class is called a method.

According to Python's glossary:

attribute: A value associated with an object which is referenced by name using dotted expressions. For example, if an object o has an attribute a it would be referenced as o.a

method: A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self). See function and nested scope.

Examples

Terminology applied to actual code:

a = 10                          # variable

def f(b):                       # function  
    return b ** 2

class C:

    c = 20                      # class attribute

    def __init__(self, d):      # "dunder" method
        self.d = d              # instance attribute

    def show(self):             # method
        print(self.c, self.d) 

e = C(30)
e.g = 40                        # another instance attribute
Sign up to request clarification or add additional context in comments.

3 Comments

Minor fix: d = C() and d.e = 30 should be un-indented.
Did you just create and set an attribute by doing e.g = 40 outside of the class definition? I see no attribute of class C, defined in the class definition. Is this typical/recommended?
I think the really interesting distinction to clarify would be a method vs an attribute that happens to be a function.
22

A method is an attribute, but not all attributes are methods. For example, if we have the class

class MyClass(object):

    class_name = 'My Class'

    def my_method(self):
        print('Hello World!')

This class has two attributes, class_name and my_method. But only my_method is a method. Methods are functions that belong to your object. There are additional hidden attributes present on all classes, but this is what your exercise is likely talking about.

6 Comments

Nitpick: methods belong to the class.
I'd rather not get into the weeds on something like that. For example, [].sort is [].sort evaluates to False because there is a method object for each instance.
Sure, I did say nitpick :). But, then again, x = []; x.sort is x.sort also evaluates to False. Because, again, the method doesn't belong to the instance. It is dynamically bound to the instance on each method call. Rather, a new method-object is created each time you call a method! There is a method object for each time you access a method using my_instance.my_method. So, of course, s = x.sort; s is s evaluates to True
Good explanation. We can verify the following using the in-built function getattr(). Therefore methods are indeed attributes of a class (class attributes), consequently, these methods are instance attributes as well.
The quote "By the way, I use the word attribute for any name following a dot" from the docs supports the view that methods are also attributes.
|
16

A quick,simplified explanation.

Attribute == characteristics. Method == operations/ actions.

For example, Let's describe a cat (meow!).

What are the attributes(characteristics) of a cat? It has different breed, name, color, whether they have spots...etc.

What are methods (actions) of a cat? It can meow, climb, scratch you, destroy your laptop, etc.

Notice the difference, attributes define characteristics of the cat.

Methods, on the other hand, defines action/operation (verb).

Now, putting the above definition in mind, let's create an object of class 'cat'...meowww

class Cat():

To create attributes, use def init(self, arg1, arg2) - (as shown below).

The 'self' keyword is a reference to a particular instance of a class.

def __init__(self, mybreed, name):
    
    # Attributes
    self.breed = mybreed
    self.name = name

# Operations/actions --> methods
def kill_mouse(self):
    print('Insert some method to kill mouse here')

Notice (above) 'mybreed' is an input argument that the user need to specify, whereas self.breed is an attribute of the instance assigned to 'mybreed' argument. Usually, they're the same (e.g. breed for both, self.breed = breed). Here, it's coded differently to avoid confusion.

And attributes are usually written as 'self.attribute_name' (as shown above).

Now, methods are more like actions, or operations, where you define a function inside the body of a class to perform some operation, for example, killing a mouse. A method could also utilize the attributes that you defined within the object itself.

Another key difference between a method and attribute is how you call it.

For example, let's say we create an instance using the above class we defined.

my_cat = Cat()

To call an attribute, you use

my_cat.name

or

my_cat.breed

For methods, you call it to execute some action. In Python, you call method with an open and close parenthesis, as shown below:

my_cat.kill_mouse()

Comments

1

A method is a function defined in the class. An attribute is an instance variable defined in the class.

Example:

class Example(object):
    def __init__(self, name):
        self.name = name
    def hello(self):
        print 'Hi, I am ' + self.name

Here hello is a method, and name is an attribute.

2 Comments

For Python 3, you don't need to inherit from object, and you need parentheses in the print call. Combining two strings just to print the combination and then discard it is vaguely unpythonic to me; probably use string formatting instead (though I don't think there is any performance difference).
Agreed. I just needed a simple example for the original question.
0
class example:
    global a
    # a=0

    def __init__(self,x,y):
        self.fname=x
        self.lname=y
    def show(self):
        return "first name: {} & Last name: {}".format(self.fname,self.lname)

obj1=example('reyan','ishtiaq')
obj2=example('ishtiaq','reyan')

print('method associated with obj1: '+ obj1.show())
print('method associated with obj2: '+ obj2.show())

obj1.a=20
obj2.a=30

print(obj1.a)
print(obj2.a)

output: method associated with obj1: first name: reyan & Last name: ishtiaq................ method associated with obj2: first name: ishtiaq & Last name: reyan................ 20 30

1 Comment

each method belong to an object just like method show(self) => show(obj1) for obj1
-1

Below u can see that I made a class called "example" with two class attributes: variable1 and variable2.

class example():
    def __init__(self, variable1, variable2):
        self.variable1 = variable1
        self.variable2 = variable1

i did not construct a method inside this class. Notice that variable1 comes first and after comes variable2 inside the init():

below i created an object "object1" with the example class. I created the example class with two arguments "variable1" and "variable2". "self" does not count), so i have to pass two arguments when calling the example class. I gave two variables "10" and "20".

object1 = example(10,20)

with the code below i just get the value of the first argument, which is 10.

print(object1.variable1)

1 Comment

As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.