[Tutor] @property vs @classmethod

Alan Gauld alan.gauld at yahoo.co.uk
Sat Jul 8 20:20:12 EDT 2017

On 09/07/17 00:03, Evuraan wrote:

> I was hoping to learn when to use classmethod and when to use property.
> They both seem similar (to me at least..), what's the pythonic way to
> choose between them?

In fact they do completely different things.

A property is a field of an object that you access via a getter or
setter method but use a syntax that looks like direct access to the
field. This allows you to implement data validity rules when setting the
data, or to restrict data access in the getter for example.

You can even create read-only or write-only properties by omitting
one or other of the get/set methods. The pythonic way is to allow
direct access to the data if you have no need of special processing.
If you do need to limit access in some way create a property.

A classmethod by contrast is a method that applies to the class as
a whole rather than the individual instances. You access a normal
method via an instance of the class:

foo = Foo()  # create instance
x = foo.bar()   # call instance method bar()

A class method is accessed via the class, no instance is needed:

y = Foo.baz()  # call class method baz()

It's possible, and even quite common, to have a classmethod being
used when no instances exist at all. This is especially so in
languages like Java, whereas in Python those cases are more
often dealt with by creating a vanilla function in a module.

Typical use cases for class methods include factory methods
to create instances in special cases - for example loading
a specific instance from a database given some arbitrary
criteria. Or it could be that a class keeps a list of all
existing instances and a classmethod reports how many
instances exist. There are many other such cases.

[Note: What is confusing is the difference between staticmethod and
classmethod. Those two are similar but subtly different and I
recommend ignoring staticmethod and just use classmethod.]

Alan G
Author of the Learn to Program web site
Follow my photo-blog on Flickr at:

More information about the Tutor mailing list