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.
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.
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.
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.
This should do the trick:
class C(object): my_var = 'a' @classmethod def t(cls): print cls.my_var C.t()
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 )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With