在Python中,如何以静态方式引用类,如PHP的“self”关键字?

时间:2009-04-10 18:31:50

标签: python class

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

显然我不能在Python中以这种方式使用“self”,因为“self”不是指一个类而是指一个实例。那么有没有一种方法可以在Python中的静态上下文中引用当前类,类似于PHP的“self”?

我想我想要做的事情就是不那么pythonic。不过不确定,我是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

我的代码按预期工作。我只是想知道:我可以在静态方法的第一行使用关键字而不是“友谊”吗?

这样,如果类名更改,则不必编辑静态方法。目前,如果类名更改,则必须编辑静态方法。

2 个答案:

答案 0 :(得分:24)

在所有情况下,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 )

答案 1 :(得分:23)

这应该可以解决问题:

class C(object):
    my_var = 'a'

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

C.t()