无需使用 class 方法和静态方法即可更改 class 属性。那它有什么用呢?
Able to change class attributes without using a classmethod and staticmethod. Then what is the use of it?
在下面的代码片段中,没有使用 class 方法或静态方法,但是 class 属性 可以通过在 class 中定义普通方法来改变,然后重点是什么?我错过了什么吗?
谁能解释一下这种行为?
class test:
var = 10
def changeVariable():
test.var = 100
def reset():
test.var = 10
>>> test.var
10
>>> test.changeVariable()
>>> test.var
100
class 中的方法只是函数。 python 中的函数对象是非数据描述符。这意味着当您在实例中查找方法时,将从 class.
访问它
你的例子调用了一堆函数。你可以通过做
来检查
>>> type(test.reset)
这些函数分配名为 test
的对象的 var
属性。 test
是 class 的事实在这里完全是偶然的:您只是将它用作常规命名空间。
要查看当您尝试将这些函数之一作为方法绑定到实例时会发生什么,您需要创建一个实例:
>>> inst = test()
现在您可以检查您的函数是否像方法一样运行:
>>> type(inst.reset)
不过,如果您尝试调用 inst.reset()
,则会出现错误,因为绑定方法是一个将实例作为第一个隐式参数传递的闭包:
>>> inst.reset()
正如您正确指出的那样,解决方法是更改函数签名,或将其包装在 staticmethod
装饰器中。
在下面的代码片段中,没有使用 class 方法或静态方法,但是 class 属性 可以通过在 class 中定义普通方法来改变,然后重点是什么?我错过了什么吗?
谁能解释一下这种行为?
class test:
var = 10
def changeVariable():
test.var = 100
def reset():
test.var = 10
>>> test.var
10
>>> test.changeVariable()
>>> test.var
100
class 中的方法只是函数。 python 中的函数对象是非数据描述符。这意味着当您在实例中查找方法时,将从 class.
访问它你的例子调用了一堆函数。你可以通过做
来检查>>> type(test.reset)
这些函数分配名为 test
的对象的 var
属性。 test
是 class 的事实在这里完全是偶然的:您只是将它用作常规命名空间。
要查看当您尝试将这些函数之一作为方法绑定到实例时会发生什么,您需要创建一个实例:
>>> inst = test()
现在您可以检查您的函数是否像方法一样运行:
>>> type(inst.reset)
不过,如果您尝试调用 inst.reset()
,则会出现错误,因为绑定方法是一个将实例作为第一个隐式参数传递的闭包:
>>> inst.reset()
正如您正确指出的那样,解决方法是更改函数签名,或将其包装在 staticmethod
装饰器中。