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
我的代码按预期工作。我只是想知道:我可以在静态方法的第一行使用关键字而不是“友谊”吗?
这样,如果类名更改,则不必编辑静态方法。目前,如果类名更改,则必须编辑静态方法。
答案 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()