В Python, как я могу ссылаться на класс в общем статическим образом, как в PHP ключевое слово «self»? - PullRequest
20 голосов
/ 10 апреля 2009

Классы PHP могут использовать ключевое слово «self» в статическом контексте, например:

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

Очевидно, что я не могу использовать «self» таким образом в Python, потому что «self» относится не к классу, а к экземпляру. Так есть ли способ, которым я могу ссылаться на текущий класс в статическом контексте в Python, аналогично PHP "self"?

Полагаю, то, что я пытаюсь сделать, довольно непитонично. Не уверен, однако, я новичок в Python. Вот мой код (с использованием фреймворка 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

Мой код работает как положено. Я просто хотел знать: есть ли ключевое слово, которое я мог бы использовать в первой строке статического метода вместо «Friendship»?

Таким образом, если имя класса изменяется, статический метод редактировать не нужно. В нынешнем виде статический метод необходимо будет отредактировать, если имя класса изменится.

Ответы [ 2 ]

24 голосов
/ 10 апреля 2009

Во всех случаях self.__class__ является классом объекта.

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

В (очень) редком случае, когда вы пытаетесь связываться со статическими методами, вам действительно нужно classmethod для этого.

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

x = AllStatic()
x.aMethod( 3.14 )
23 голосов
/ 10 апреля 2009

Это должно сработать:

class C(object):
    my_var = 'a'

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

C.t()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...