2009-04-10 5 views
20

clases PHP puede utilizar la palabra clave "auto" en un contexto estático, como esto:En Python, ¿cómo hago referencia a una clase genéricamente de forma estática, como la palabra clave "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. 
    } 
} 
?> 

Es obvio que no se puede utilizar "auto" de esta manera en Python porque "auto" no se refiere a una clase, pero a una instancia. Entonces, ¿hay alguna forma de que pueda hacer referencia a la clase actual en un contexto estático en Python, similar al "self" de PHP?

Supongo que lo que estoy tratando de hacer es bastante antipático. Aunque no estoy seguro, soy nuevo en Python. Aquí está mi código (usando el marco 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 

Mi código funciona como se esperaba. Solo quería saber: ¿hay alguna palabra clave que pueda usar en la primera línea del método estático en lugar de "Amistad"?

De esta manera si el nombre de la clase cambia, el método estático no tendrá que ser editado. Tal como está, el método estático debería editarse si el nombre de la clase cambia.

+0

cuando trato de usar self .__ class__ dentro de un método estático, consigo nombre global 'yo' no está definido – Eddified

+0

¿Sigue pasando "auto "al método? Recuerde que "self" es un nombre de parámetro, no una palabra clave. –

+0

@Eddified: probablemente debería haber sido un comentario sobre la respuesta, no la pregunta –

Respuesta

22

Esto debería hacer el truco:

class C(object): 
    my_var = 'a' 

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

C.t() 
+0

Fácil de entender, era perfectamente análogo al ejemplo de php. Funciona para mi. ¡Gracias! – Eddified

23

En todos los casos, self.__class__ es una clase de objeto.

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

En el caso (muy) poco frecuente en la que está tratando de meterse con los métodos estáticos, en realidad se necesitan para este classmethod.

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

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

¿Se supone que estoy pasando "yo" a una función estática? @staticmethod def blah(): ... – Eddified

+0

No, no lo eres. Un método estático en general no necesita ningún argumento. –

Cuestiones relacionadas