Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 能够在不使用classmethod和staticmethod的情况下更改类属性。那它有什么用呢?_Python_Python 3.x_Python Class - Fatal编程技术网

Python 能够在不使用classmethod和staticmethod的情况下更改类属性。那它有什么用呢?

Python 能够在不使用classmethod和staticmethod的情况下更改类属性。那它有什么用呢?,python,python-3.x,python-class,Python,Python 3.x,Python Class,在下面的代码片段中,没有使用classmethod或staticmethod,但是可以通过在类中定义普通方法来更改类属性,那么这有什么意义呢?我错过什么了吗 有人能解释一下这种行为吗 class test: var = 10 def changeVariable(): test.var = 100 def reset(): test.var = 10 类中的方法只是函数。函数对象在python中是非数据描述符。这意味着,当您在实例中查找方

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

有人能解释一下这种行为吗

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

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

您的示例调用了一系列函数。您可以通过执行以下操作来检查这一点

>>> type(test.reset)
这些函数指定名为
test
的对象的
var
属性。
test
是一个类的事实在这里完全是偶然的:您只是将它用作常规名称空间

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

>>> inst = test()
现在,您可以检查函数的行为是否与方法相同:

>>> type(inst.reset)
但是,如果尝试调用
inst.reset()
,则会出现错误,因为绑定方法是将实例作为第一个隐式参数传递的闭包:

>>> inst.reset()

正如您正确指出的,解决方法是要么更改函数签名,要么将其包装在
staticmethod
decorator中。

下面是一个很好的解释。同意你的观点,我只是想知道我是否可以在同一个类中使用类名来访问它的属性并修改类级别的更改。当我有@classmethods时,添加另一个创建装饰器的开销是没有任何意义的。这里我排除了类实例化,我只关心类方法和静态方法。@user15994405。您不能在类主体中使用类名,您也不能。您在恰好位于类命名空间中的函数对象中使用类名。在调用函数之前,不会访问类名。我不太清楚为什么要使用类作为名称空间,因为您不想使用它提供的任何描述符处理功能,总而言之,我们可以使用我发布的方法来实现与黑客相同的功能,但是标准的更好的方法是使用staticmethod和classmethod。如果我是,请纠正我wrong@Kazee. 一个更好的方法就是制作一个函数容器。如果你没有将某些东西用于预期目的,你可能会做得更好。同时,如果你的方法行得通,那很好,谢谢
>>> inst.reset()