我已经在Python中编写了一段时间,而且最近我得到了一些可能破坏Python的脚本的想法。其中之一是为方法的返回值赋值。为什么这段代码合法?它不应该导致错误吗?如果不是,是否有这种解释的用途?
class SomeClass:
x = 10
def Method():
return SomeClass()
print(Method().x)
#This line concerns me!
Method().x = 5
print(Method().x)
答案 0 :(得分:2)
表达式Method().x = 5
是合法的,但基本上什么都不做。代码首先创建一个新的SomeClass实例,为其x字段分配5,最后丢弃它,因为SomeClass实例不存储在任何地方。之后的print(Method().x)
正在创建另一个SomeClass的新实例,并打印其x字段的值,该字段已被初始化为10并且从未更改过。
简而言之:每个Method()
都会创建一个SomeClass类的新独立实例,并带有各自独立的x字段。
这样可行:
instance = Method()
instance.x = 5
print(instance.x)
答案 1 :(得分:0)
基本上,您正在使用类属性 SomeClass
创建名为x = 10
的班级。
如上所述here,类属性与某些编程语言(如C ++或Java)中的类中使用的static
关键字相似但不相同。
根据python docs(https://docs.python.org/2/tutorial/classes.html),[...] Class属性也可以分配给,因此您可以通过赋值更改 SomeClass.x
的值。 [...]
但是,这不是您的情况,因为每次调用Method()
函数时,您基本上都在创建SomeClass()
的新实例。
编辑:请看这个
class SomeClass:
x = 10
def Method():
return SomeClass()
myInstance = Method()
print(myInstance.x) # prints '10'
myInstance.x = 5
print(myInstance.x) # prints '5'
在这种情况下,您要修改类的同一个实例中的class属性,名为myInstance
,并按照文档中的说明成功更改其值。