Python 3 静态成员

标签 python python-3.x

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

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/

相关文章:

python - Tensorflow VarLenFeature 与 FixedLenFeature

python - 列表差异

python - 在 python 中查找 utf-16 文件。如何?

python - Numpy 三列之间的最大参数项数,输出为数组

python - 我们如何确定属性属于实例还是类?

Python读取.txt文件->列表

django - 如何编辑默认 django 主页和新页面

python - 在python2虚拟环境中安装python3

java - Java 中的 python pickle.dumps 和 struct.pack

python - 如何获得成功和错误代码?