用 self 调用类变量

2023-12-14

你会如何想出这个有趣的(至少对我来说)例子。

import numpy as np


class Something(object):
    a = np.random.randint(low=0, high=10)

    def do(self):
        self.a += 1
        print(self.a)

if __name__ == '__main__':
    something = Something()
    print(something.__str__())
    something.do()
    something2 = Something()
    print(something2.__str__())
    something2.do()
    something3 = Something()
    print(something3.__str__())
    something3.do()

以上在控制台中打印以下内容:

$ python test.py
<__main__.Something object at 0x7f03a80e0518>
1
<__main__.Something object at 0x7f03a80cfcc0>
1
<__main__.Something object at 0x7f03a80cfcf8>
1

我有点困惑,因为我(错误地)假设了a会增加。

如果我使用的话,我可以获得我期望的行为@classmethod装饰师。

import numpy as np


class Something(object):
    a = np.random.randint(low=0, high=10)

    @classmethod
    def do(cls):
        cls.a += 1
        print(cls.a)

if __name__ == '__main__':
    something = Something()
    print(something.__str__())
    something.do()
    something2 = Something()
    print(something2.__str__())
    something2.do()
    something3 = Something()
    print(something3.__str__())
    something3.do()

这会在控制台中正确打印以下内容。

python test.py
<__main__.Something object at 0x7faac77becc0>
3
<__main__.Something object at 0x7faac77becf8>
4
<__main__.Something object at 0x7faac77c3978>
5

现在,我想知道在第一个例子中,当我打电话时self.a,我正在访问什么?它不是一个类变量,因为我似乎无法更改它的值。它也不是实例变量,因为它似乎在同一类的不同对象之间共享。你会怎么称呼它?

这是我使用错误方式使用的类变量吗?我知道clsname 如果是一个约定,所以也许我真正访问了一个类变量,但我无法更改它的值,因为我还没有用@classmethod装饰师。

这是一种非法使用该语言吗?我的意思是最好不要做一些事情,以避免在后期引入错误?


正在发生的事情是self.a指的是two不同时间的事情。

当某个名称不存在实例变量时,Python 将查找该类的值。所以检索到的值是self.a将是类变量。

但当setting属性通过self,Python将always设置实例变量。所以现在self.a是一个新的实例变量,其值等于类变量 + 1。此属性隐藏了类属性,您无法再通过self但只能通过课堂。

(一个与问题无关的小问题:你不应该直接访问双下划线方法。而不是调用something2.__str__(), call str(something2) etc.)

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

用 self 调用类变量 的相关文章

随机推荐

  • 两个单选按钮同时选择

    我正在添加一个单选按钮divjsp页面的 但是新添加的单选按钮始终处于选择状态 当我单击第二个单选按钮时 它也会选择 有没有脚本可以写这个 div style padding left 15px div Entry Mode Code wa
  • 获取私人 bitbucket 存储库,给出 403 禁止

    执行时go get bitbucket org 我收到这个错误 yash jain projectname go get bitbucket org go bitbucket org https api bitbucket org 2 0
  • UICollectionView 收到索引路径不存在的单元格的布局属性

    我使用 UICollection 视图来显示网格布局中的项目 对于数据源 我使用 5 5 维数组 我还为节中的 numberOfItems 返回 5 为 numberOfSections 返回 5 然后我的应用程序也因以下错误而崩溃 UIC
  • 使用 C# 是否可以测试文件是否持有锁

    背景 我使用文件偏移量和文件流锁定 解锁方法来控制读 写访问 我正在使用以下代码来测试文件当前是否持有锁 try fs Lock RESERVED BYTE 1 fs Unlock RESERVED BYTE 1 rc 1 catch rc
  • 在 VBA 中使用 InStr 进行多字符串搜索

    我正在检查名称文本框是否以 Mr Mrs Ms 等开头 我创建了一个函数 但无法比较多个字符串 这是我的代码 Checking whether name is starts with Mr Mrs Ms Dr or not If Not F
  • 用外行人的话来说,什么是 Unobtrusive Javascript? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 用外行人的话来说 什么是 Unobtrusive Javascript 举一个例子可以很好地帮助我理解 查看维基百科文章 不引人注目的 JavaScript Unobtrusiv
  • git merge:删除我想保留的文件!

    如何在 git 中合并两个分支 同时保留必要的来自分支的文件 合并两个分支时 如果一个文件在一个分支中被删除 而在另一个分支中没有被删除 则该文件最终将被删除 例如 当您创建新分支时 master 中存在一个文件 您从 master 中删除
  • 创建较大集合的固定长度非重复排列

    我知道这个话题被广泛讨论 但我似乎找不到任何适合我需求的实现 我有以下字符集 abcdefgh 我想获得所有可能的排列或组合 不重复 但在有限 可变 字符集上 意思是如果我输入字符和数字2 结果应该是这样的 ab ba ac ca ad d
  • 将原始输入变量除以数字时出现 Python TypeError

    我想将输入的磅重量转换为千克 但出现以下错误 类型错误 不支持的操作数类型 unicode 和 float My code lbweight raw input Current Weight lb kgweight lbweight 2 2
  • 挂载前判断网络共享是否存在

    我正在开发一种工具 可以根据用户连接的无线网络自动安装网络卷 安装卷很简单 NSURL volumeURL The URL to the network volume Attempt to mount the volume FSVolume
  • Springboot异常处理程序没有捕获异常

    在 Spring Boot 和 Rest 应用程序中 我配置了一个异常处理程序 如下所示 如果在请求使其停止服务后抛出异常 它可以正常工作 Rest api 需要 application json 的内容类型 如果我不将该内容类型标头发送到
  • 用 Java 处理条形码扫描

    我想让我的应用程序对扫描的条形码做出反应以触发按钮按下 例如 用户可以扫描 打印 条形码来激活打印按钮 条形码将被视为用户输入了一些文本 我不确定扫描仪是否会被设置为在末尾附加一个输入或一个选项卡或什么都没有 所以我不想在此基础上做出假设
  • 将等高线添加到 3D 绘图

    我正在使用 R 编程语言 我使用 plotly 库制作了以下 3 维图 library dplyr library plotly my function lt function x y final value 1 x 2 100 y x 2
  • 如何获取 foreach 循环当前迭代的索引?

    在 C 中是否有一些我没有遇到过的罕见语言构造 比如我最近学到的一些 一些在 Stack Overflow 上 来获取表示 foreach 循环当前迭代的值 例如 我目前根据情况做这样的事情 int i 0 foreach Object o
  • Threejs Blender 导出器导出格式错误

    我正在尝试在提供的帮助下将搅拌机模型导出到 Threejs json搅拌机出口商 解析 json 文件时出现错误 Uncaught TypeError Cannot read property length of undefined jso
  • 运行 plm 固定效应模型并添加因子虚拟变量(树方式固定效应)是否可以?

    运行 plm 固定效应模型并在 R 中添加因子虚拟变量 如下所示 是否可以 时间 公司 和 国家 这三个因素都是独立的指数 我想将它们一起修复 我发现下面的规范更适合我的情况 而不是通过组合 公司 和 国家 地区 来总共创建两个索引 这是可
  • Perl 数组与列表

    我在 Perl 中有两个数据结构 数组 my array2 1 2 3 for elem array2 print elem n 给我以下输出 1 2 3 还有一个清单 my array 1 2 3 for elem array print
  • 在 Java 中 - 如何将 resultSet 映射到复杂对象?

    如何将几个表中的结果集映射到复杂的对象中 让我详细说明一下 假设我有这两门课 public class User private int user id private String fname private String lname g
  • Facebooker 扩展权限?

    Facebook 允许访问 通过扩展权限访问用户的电子邮件 JS 和 PHP 中还有一种方法可以强制用户授予 当他们接受应用程序的 TOS 时获得许可 http wiki developers facebook com index php
  • 用 self 调用类变量

    你会如何想出这个有趣的 至少对我来说 例子 import numpy as np class Something object a np random randint low 0 high 10 def do self self a 1 p