我正在努力实现以下目标:
class A:
username = None
username = get_username()
def get_username(self):
if username is None:
try:
uname = os.environ["USER"]
except:
printf("Couldn't find a user name")
return uname
return username
不确定如何实现这一点。我确定我缺少一些“ self ”。前缀,但这是我第一次使用 python 和静态成员。
从某种意义上说,我想要一个包含一些成员和函数的类来计算这些成员的值,但我不想重新计算。我还希望它们是静态函数和数据成员。
问题是函数“username = get_username()”这一行还没有被定义。如果我将用户名放在函数之后,那么它就不是
最佳答案
首先,如果您只是想在之后立即重新分配它,则没有理由将 None
分配给 username
。
其次,如果你希望方法是静态方法,你不能给它一个self
参数。如果您想要一个真正的静态方法,则必须显式声明它。
@staticmethod
def get_username():
if username is None:
...
否则,您需要类的一个实例(self
)来调用它,而您还没有。
在 Python 3 中,任何常规方法在类上调用时都像静态方法,在实例上调用时像实例方法。因此,如果您确定永远不想在实例 a
上调用 a.get_username()
,则可以跳过装饰器。但是您仍然需要去掉 self
参数。
我认为您实际上试图做的是使用类变量来记住静态方法的结果。你不能那样做,但你可以使用一个类变量来记住 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
另一方面,没有充分的理由用户名必须是类成员。您可以通过向函数添加一个成员、传递一个可变的默认变量或以各种其他不需要感染类的方式来内存,这些方式允许您将 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
同样,如果您确定没有人会尝试创建 A
的实例并调用 get_username
,您可以删除 @staticmethod
> 在上面。
关于Python 3 静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201822/