gpt4 book ai didi

Python 3 静态成员

转载 作者:太空狗 更新时间:2023-10-29 21:35:07 26 4
gpt4 key购买 nike

我正在努力实现以下目标:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com