首页 > 解决方案 > 能够在不使用类方法和静态方法的情况下更改类属性。那么它有什么用呢?

问题描述

在下面的代码片段中,没有使用 classmethod 或 staticmethod,但可以通过在类中定义普通方法来更改类属性,那么重点是什么?我错过了什么吗?

谁能解释一下这种行为?

class test:
    var = 10
    def changeVariable():
        test.var = 100
    def reset():
        test.var = 10
>>> test.var
10
>>> test.changeVariable()
>>> test.var
100

标签: pythonpython-3.xpython-class

解决方案


类中的方法只是函数。函数对象是 python 中的非数据描述符。这意味着当您在实例中查找方法时,将从类中访问它。

您的示例调用了一堆函数。你可以通过这样做来检查这个

>>> type(test.reset)

这些函数分配var名为 的对象的属性test。作为一个类的事实test在这里完全是偶然的:您只是将它用作常规名称空间。

要查看当您尝试将这些函数之一作为方法绑定到实例时会发生什么,您需要创建一个实例:

>>> inst = test()

现在您可以检查您的函数是否作为方法运行:

>>> type(inst.reset)

如果你尝试调用你会得到一个错误inst.reset(),因为绑定方法是一个闭包,它将实例作为第一个隐式参数传递:

>>> inst.reset()

正如您正确指出的那样,解决方法是更改​​函数签名或将其包装在staticmethod装饰器中。


推荐阅读