python - 能够在不使用类方法和静态方法的情况下更改类属性。那么它有什么用呢?
问题描述
在下面的代码片段中,没有使用 classmethod 或 staticmethod,但可以通过在类中定义普通方法来更改类属性,那么重点是什么?我错过了什么吗?
谁能解释一下这种行为?
class test:
var = 10
def changeVariable():
test.var = 100
def reset():
test.var = 10
>>> test.var
10
>>> test.changeVariable()
>>> test.var
100
解决方案
类中的方法只是函数。函数对象是 python 中的非数据描述符。这意味着当您在实例中查找方法时,将从类中访问它。
您的示例调用了一堆函数。你可以通过这样做来检查这个
>>> type(test.reset)
这些函数分配var
名为 的对象的属性test
。作为一个类的事实test
在这里完全是偶然的:您只是将它用作常规名称空间。
要查看当您尝试将这些函数之一作为方法绑定到实例时会发生什么,您需要创建一个实例:
>>> inst = test()
现在您可以检查您的函数是否作为方法运行:
>>> type(inst.reset)
如果你尝试调用你会得到一个错误inst.reset()
,因为绑定方法是一个闭包,它将实例作为第一个隐式参数传递:
>>> inst.reset()
正如您正确指出的那样,解决方法是更改函数签名或将其包装在staticmethod
装饰器中。
推荐阅读
- next.js - 在 NextJS 中设置目录的正确方法
- python-3.x - 数据帧到 csv 文件不包括数字(表中的浮点数)和清理 '\n'
- python - Django 验证返回两个错误而不是一个
- c# - C# Windows 窗体使用 SQLite 数据库,打开连接时为 NullReference
- database - 获取数据库连接错误。MariaDB 经常关闭。该怎么办?
- python - 将数字添加到列表中的重复字符串
- php - laravel 7 'laravel.password_resets' 不存在
- sql - Oracle 按问题分组 sql 查询
- arrays - 解释请求:有序数组查找非重复元素
- c# - Unity 从 Windows Store 加载证书