- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个简单的程序。
class Sample:
num =45
def __init__(self):
print('Inside constructor')
@classmethod
def modifyUsingClassMethod(cls):
cls.num = cls.num + 45
@staticmethod
def modifyUsingStaticMethod():
Sample.num = Sample.num+5
s1 = Sample()
s2 = Sample()
s1.modifyUsingClassMethod()
print(s1.num, s2.num)
s1.num = s1.num + 5
print(s1.num)
s1.modifyUsingClassMethod()
print(s1.num, s2.num)
s1.modifyUsingStaticMethod()
print(s1.num, s2.num)
输出:
Inside constructor
Inside constructor
90 90
95
95 135
95 140
谁能解释一下 @staticmethod
和 @classmethod
如何以及为什么作用于变量“num”?为什么输出显示 95,135
即使我使用 modifyUsingClassMethod()
使用 s1 实例更改了 num 的值,为什么它在两种情况下都没有使用 @staticmethod 更新
和 @classmethod
?
我想当我使用类对象引用变量 num
时,python 将变量 num
视为实例变量但是当我更改变量 num
使用类名,那么该值不会在 s1
中更新,而是在 s2
中更新。我很困惑 @classmethod
和 @staticmethod
是如何工作的。
最佳答案
您的类方法和静态方法都只会更改类级变量。问题是您在执行此操作时隐藏了您的实例变量 s1
中的类变量 num
:
s1.num = s1.num + 5
这创建了一个实例变量,它隐藏了实例命名空间中的类变量。当你访问一个对象时,将检查实例的命名空间,如果没有找到具有该名称的属性,它将尝试类命名空间,然后它将检查方法中所有类的命名空间-结果-顺序:MRO(这是继承)。
考虑一下你的例子:
In [1]: class Sample:
...: num =45
...:
...: def __init__(self):
...: print('Inside constructor')
...:
...: @classmethod
...: def modifyUsingClassMethod(cls):
...: cls.num = cls.num + 45
...:
...: @staticmethod
...: def modifyUsingStaticMethod():
...: Sample.num = Sample.num+5
...:
In [2]: s1 = Sample()
...: s2 = Sample()
...:
...: s1.modifyUsingClassMethod()
...: print(s1.num,s2.num)
...:
...: s1.num = s1.num + 5
...: print(s1.num)
...:
...: s1.modifyUsingClassMethod()
...: print(s1.num,s2.num)
...:
...: s1.modifyUsingStaticMethod()
...: print(s1.num,s2.num)
...:
Inside constructor
Inside constructor
90 90
95
95 135
95 140
现在看看对象:
In [4]: vars(Sample)
Out[4]:
mappingproxy({'__dict__': <attribute '__dict__' of 'Sample' objects>,
'__doc__': None,
'__init__': <function __main__.Sample.__init__>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Sample' objects>,
'modifyUsingClassMethod': <classmethod at 0x107c3fe48>,
'modifyUsingStaticMethod': <staticmethod at 0x107c3ff98>,
'num': 140})
In [5]: vars(s1)
Out[5]: {'num': 95}
In [6]: vars(s2)
Out[6]: {}
你可以清楚地看到 s1
的命名空间中有 num
,隐藏了 Sample
的命名空间。
注意当我们从实例 namespace 中删除 num
时会发生什么:
In [11]: del s1.num
In [12]: s1.num
Out[12]: 140
关于python - @staticmethod 和@classmethod 如何作用于python 中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49167024/
我想要一个“父”节点,它生成数据并将其传递给工作节点,工作节点将对数据进行必要的计算。 我希望父节点坐下来“监听”工作节点何时告诉他他已准备好接收数据。 实现这一目标的最佳方法是什么?我应该为此使用哪
我想从 c# 写一些 Html(html 是一个例子,这可能是其他语言..) 例如: string div = @" Mon text
由于某种原因,在使用我放置在 XML 中的任何新 View 时,我收到了 nullPointerException。 View 类型(TextView、EditText 等)并不重要。我最初工作的任何
就像在 hibernate 中一样,在 EclipseLink 中,我们有注释 @AdditionalCriteria,它允许我们在数据上添加过滤器。在 hibernate 中,它作为@Filter,
file_get_contents() [function.file-get-contents]: SSL: Connection reset by peer in 上 file_get_conten
我有一个简单的 从某些 JS 中隐藏的标签。 ( display:none )我查看了页面源代码,发现它没有隐藏,但是检查器将其显示为显示:无(内联样式) 为了隔离隐藏 的代码部分,在 JS 代码中
我在 GUI 中工作,我有多种类型的事件可能会导致按钮被禁用。我已经尝试了几种方法来组合这两个 Observable,但我发现的每个解决方案都需要两个 Observable 在产生结果之前发布一个事件
我正在尝试让 jquery 在使用 GWT 时为我做一些 ui 影响。我有添加到页面的通知,点击后应该会消失。由于可能有多个相同类型的通知(警告、错误等),我试图仅在通过 GWT 单击它们时才动态添加
我有一组具有以下结构的复选框: A1 A2 ... 复选框仅用于 UI 控制(不用于表单提交)。我有一个关联的 html 元素,它有一个 onclick
作用于 UDP 套接字时,什么会导致 sendto() 发送的字节数少于请求的字节数? 提出这个问题的动机是找出我需要采取的预防措施,以确保我 始终 在一次调用 sendto() 时收到完整的消息,并
我正在编写一个 postgresql View ,它使用一些复杂的逻辑来生成数据行。它要求我对从查询两个不同表的结果派生的两组数据执行相同的一组步骤。是否可以编写一个概括这些步骤的函数? 例如: CR
我想在按下后更改每个图标的颜色。但是 Expandable Container 中的所有图标在按下其中一个后都会发生变化。 class _ExpandableListViewState extends
我正在动态提取 HTML 内容以在我的站点页面中显示注释。问题是我导入的 HTML 内容在样式标签下嵌入了 CSS,所以它基本上扰乱了我的页面样式。有没有什么办法可以阻止传入的样式作用于我的页面? 例
当我将 stdin FD 状态标志设置为 O_NONBLOCK_fileno, F_GETFL); flag = fcntl(stderr->_fileno, F_GETFL); if(-1
我是一名优秀的程序员,十分优秀!