首先,没有理由分配None
to username
如果您要立即重新分配它。
其次,如果你希望该方法是一个静态方法,你不能给它一个self
争论。如果你想要一个真正的静态方法,你必须显式声明它。
@staticmethod
def get_username():
if username is None:
...
否则,您需要该类的一个实例(即self
) 来调用它,而您还没有。
在Python 3中,任何常规方法在类上调用时都像静态方法一样,在实例上调用时像实例方法一样。所以,如果你确定你永远不想打电话a.get_username()
在一个实例上a
,你可以跳过装饰器。但你仍然需要摆脱self
范围。
我想你是什么actually尝试做的是使用类变量来记忆静态方法的结果。你不能这样做,但你可以使用类变量来记忆 a 的结果class方法,这可能足够接近。那看起来像这样:
class A:
username = None
@classmethod
def get_username(cls):
if cls.username is None:
try:
uname = os.environ["USER"]
except:
print("Couldn't find a user name")
else:
cls.username = uname
return cls.username
另一方面,没有充分的理由 username 必须是类成员。您可以通过向函数添加成员、传递可变的默认变量或其他各种不需要感染类并允许您离开的方式来记忆get_username
作为静态方法而不是类方法。
但实际上,最好的解决方案是在 PyPI 上、ActiveState 的配方列表等中找到一个记忆库,所以你可以这样写:
class A:
@memoize
@staticmethod
def get_username():
try:
return os.environ["USER"]
except:
print("Couldn't find a user name")
return None
同样,您可以删除@staticmethod
如果你确定没有人会尝试创建一个实例A
并打电话get_username
on it.