2009-04-10 6 views
20

classes PHP peuvent utiliser le mot-clé « auto » dans un contexte statique, comme ceci:En Python, comment référencer une classe de manière statique, comme le mot-clé "self" de PHP?

<?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. 
    } 
} 
?> 

Il est évident que je ne peux pas utiliser « soi » de cette manière en Python parce que « soi » ne se réfère pas à une classe, mais à une instance. Donc est-il possible de référencer la classe actuelle dans un contexte statique en Python, similaire au "self" de PHP?

Je suppose que ce que j'essaie de faire est plutôt un-pythonic. Pas sûr cependant, je suis nouveau à Python. Voici mon code (en utilisant le framework Django):

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 

Mon code fonctionne comme prévu. Je voulais juste savoir: y a-t-il un mot-clé que je pourrais utiliser sur la première ligne de la méthode statique au lieu de "Friendship"? De cette façon, si le nom de la classe change, la méthode statique n'aura pas à être modifiée. En l'état, la méthode statique devrait être éditée si le nom de la classe change.

+0

lorsque je tente d'utiliser l'auto .__ class__ dans une méthode statique, je reçois nom « auto » global n'est pas définie – Eddified

+0

Vous êtes de passage encore « auto "à la méthode? Rappelez-vous que "self" est un nom de paramètre, pas un mot-clé. –

+0

@Eddified: cela aurait probablement dû être un commentaire sur la réponse, pas la question –

Répondre

22

Cela devrait faire l'affaire:

class C(object): 
    my_var = 'a' 

    @classmethod 
    def t(cls): 
     print cls.my_var 

C.t() 
+0

Facile à comprendre, était parfaitement analogue à l'exemple php. Travaille pour moi. Merci! – Eddified

23

Dans tous les cas, self.__class__ est la classe d'un objet.

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

Dans le (très) rares cas où vous essayez de jouer avec des méthodes statiques, vous devez réellement classmethod pour cela.

class AllStatic(object): 
    @classmethod 
    def aMethod(cls, arg): 
     # cls is the owning class for this method 

x = AllStatic() 
x.aMethod(3.14) 
+0

Suis-je censé passer "self" à une fonction statique? @staticmethod def blah(): ... – Eddified

+0

Non, vous ne l'êtes pas. Une méthode statique en général n'a pas besoin d'arguments. –

Questions connexes