Python 3 静态成员

2024-01-12

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

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

不知道如何实现这一目标。我确信我缺少一些“自我”。前缀,但这是我第一次使用 python 和静态成员。

从某种意义上说,我想要一个具有一些成员和函数的类来计算这些成员的值,但我不想重新计算。我还希望这些是静态函数和数据成员。

问题是“username = get_username()”行该函数尚未定义。如果我将用户名放在函数后面,那么它就不是


首先,没有理由分配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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 静态成员 的相关文章

随机推荐

  • 从 JS 文件中获取 Vue

    我对现代前端开发工具还很陌生 我安装了 Nodejs 和 NPM 下载了一些软件包 例如 jquery 并且一切正常 然后我安装了 Webpack 第 2 版 我创建了这个演示配置文件 module exports entry entry
  • 如何实现四个 i8 元素组的高效 _mm256_madd_epi8 点积?

    Intel 提供了一个名为 mm256 madd epi16 的 C 风格函数 基本上 m256i mm256 madd epi16 m256i a m256i b 将 a 和 b 中的压缩有符号 16 位整数相乘 生成中间有符号 32 位
  • 如何同步远程服务器数据库与本地数据库

    我想在期间获取从远程服务器数据库到本地数据库的单个表的所有详细信息页面加载事件或其他一些好的方法 应该作为后端进程发生 任何人都可以帮助我解决这个问题 1 在桌面和 Web 应用程序中创建的单个应用程序 2 当用户在桌面应用程序中注册新客户
  • Quarkus 自定义授权拦截器

    我有一个 Quarkus 微服务 使用 quarkus oidc 和 quarkus keycloak authorization 扩展通过 Keycloak 进行身份验证和授权 我需要另外实现以下两个请求拦截器 过滤器 任何身份验证逻辑启
  • 如何阻止 ejabberd 使用 mnesia [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试建立一个将数据库从崩溃的服务器恢复到新服务器的过程 我的服务器正在运行 Ejabberd 作为 XMPP 服务器 并且我将其配置为使用 po
  • Sublime Text 中 >= 和 <= 运算符的语法高亮显示

    我正在尝试为 Matlab 运算符获得正确的语法突出显示 gt and lt 目前 仅 lt and gt 被突出显示 而不是 但例如 被突出显示 我看过Matlab tmLanguage文件 以及两者 gt and lt 包含在运算符正则
  • 向 CreateThread 传递多个参数

    问题 How to pass具体来说two论点创建线程 http msdn microsoft com en us library ms682453 VS 85 aspx when 参数一 类型SOCKET 论证二 一个接口指针 COM S
  • Django 文件字段编码

    我有一个 django 模型如下 class ExportFile BaseExportFile created timestamp models DateTimeField auto now True editable False dat
  • 使用 d3.js 制作分组条形图

    我是 d3 js 的新手 我发现很难创建分组条形图 但我尝试了一些似乎不正确的方法 我想要 x 轴上的月份和 y 轴上的组数 火星和木星 像这样的东西Link https i stack imgur com VowEA png var sv
  • 在 Jsch 中设置 ASCII 模式

    我需要解决当前遇到的 Unix Windows 文件格式 LF 到 CRLF 问题 我使用的 ftp 客户端是 Jcraft 的 Jsch 在线文档非常简单 尽管我遇到了一个可以设置的标志 SSH FXF TEXT MODE 启用 ASCI
  • 类方法无法访问属性

    我创建了一个像这样的类 function MyClass var myInt 1 MyClass prototype EventHandler function e alert this myInt 不幸的是 this是触发的事件 在我的例
  • 如何将大型多维数组部分写入 HDF5 文件?

    我在 C 中使用 HDF5DotNet 并且有一个非常大的数组 几个 GB 我想将其写入 HDF5 文件 它太大了 无法将整个内容存储在内存中 因此我一次生成它的区域并想将它们写出来 但在读回时仍然让它看起来像一个大数组 我知道 HDF5
  • 背景图像占窗口的 100%(并随之调整大小)

    重复 拉伸和缩放 CSS 背景 https stackoverflow com questions 376253 stretch and scale css background 如何拉伸背景图像以覆盖整个 HTML 元素 https st
  • PHP 对象数组不是线性缩放的,而全局数组却可以?

    使用对象内数组作为属性与使用全局 php 数组变量相比 存在一个主要的性能问题 为什么 为了对这个问题进行基准测试 我创建了以下基准测试 它存储一个越来越大的数组 并以 stdClass 作为节点 运行了两个测试 一个使用类中的数组属性 另
  • 如何阅读Haskell中内置函数的实现代码/源代码?

    例如 如果我想阅读默认的源代码curryPrelude 中的函数 我在哪里引用 有没有办法阅读它的实现 我尝试在Hoogle中搜索它 但它没有给出确切的实现 只是给出了输入和输出类型 我在堆栈上使用 GHCI 来运行 haskell 胡格尔
  • SQL查询的执行顺序

    我对该查询的执行顺序感到困惑 请解释一下 我对何时应用联接 调用函数 随案例添加新列以及何时添加序列号感到困惑 请解释这一切的执行顺序 select Row number OVER ORDER BY SELECT 1 AS Serial N
  • sql server 中的多个 NOT LIKE

    我有一张像这样的桌子 id name 302345 Name1 522345 Name2 1X2345 Name3 2X2345 Name4 1X8765 Name5 2X2123 Name6 502345 Name7 M62345 Nam
  • 为什么食谱在看起来没有必要时提倡重写 getItemViewType 和 getViewTypeCount ?

    我一直在学习 Commonsware Android 编程教程 在教程 5 额外学分 2 中 挑战是根据对象的 类型名称 餐厅的 类型 属性 使用多种布局在 ListView 中显示行 这是一个字符串 因此 它建议重写getItemView
  • 替换lua中包含特殊字符的字符串

    我想替换lua中的字符串 这是字符串 strng begin matrix 1 2 3 4 5 6 7 8 10 end matrix 我想更换 begin matrix by by by end matrix by 我还想删除所有空格 所
  • Python 3 静态成员

    我正在努力实现以下目标 class A username None username get username def get username self if username is None try uname os environ U