Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Python, how do I reference a class generically in a static way, like PHP's "self" keyword?

Tags:

python

class

PHP classes can use the keyword "self" in a static context, like this:

<?php class Test {   public static $myvar = 'a';   public static function t() {      echo self::$myvar; // Generically reference the current class.      echo Test::$myvar; // Same thing, but not generic.   } } ?> 

Obviously I can't use "self" in this way in Python because "self" refers not to a class but to an instance. So is there a way I can reference the current class in a static context in Python, similar to PHP's "self"?

I guess what I'm trying to do is rather un-pythonic. Not sure though, I'm new to Python. Here is my code (using the Django framework):

class Friendship(models.Model):   def addfriend(self, friend):     """does some stuff"""    @staticmethod # declared "staticmethod", not "classmethod"   def user_addfriend(user, friend): # static version of above method     userf = Friendship(user=user) # creating instance of the current class     userf.addfriend(friend) # calls above method  # later .... Friendship.user_addfriend(u, f) # works 

My code works as expected. I just wanted to know: is there a keyword I could use on the first line of the static method instead of "Friendship"?

This way if the class name changes, the static method won't have to be edited. As it stands the static method would have to be edited if the class name changes.

like image 672
Eddified Avatar asked Apr 10 '09 18:04

Eddified


People also ask

How do you call a static class in Python?

A static method doesn't have access to the class and instance variables because it does not receive an implicit first argument like self and cls . Therefore it cannot modify the state of the object or class. The class method can be called using ClassName. method_name() as well as by using an object of the class.

Can I use self in static method Python?

A static method is precisely one which does not take self because it does not need to call other instance methods, or would do so via the class name.

Can static methods be called with self?

You can call static methods on self , because self is an instance of the class that has the static method, and thus has the method. You can also call static methods on classes directly, because a static method doesn't require an object instance as a first argument - which is the point of the static method.


2 Answers

This should do the trick:

class C(object):     my_var = 'a'      @classmethod     def t(cls):         print cls.my_var  C.t() 
like image 138
Bastien Léonard Avatar answered Oct 10 '22 16:10

Bastien Léonard


In all cases, self.__class__ is an object's class.

http://docs.python.org/library/stdtypes.html#special-attributes

In the (very) rare case where you are trying to mess with static methods, you actually need classmethod for this.

class AllStatic( object ):     @classmethod     def aMethod( cls, arg ):         # cls is the owning class for this method   x = AllStatic() x.aMethod( 3.14 ) 
like image 28
S.Lott Avatar answered Oct 10 '22 15:10

S.Lott