如何在Python中为方法的输出赋值?

时间:2018-05-01 23:42:10

标签: python-3.x runtime-error

我已经在Python中编写了一段时间,而且最近我得到了一些可能破坏Python的脚本的想法。其中之一是为方法的返回值赋值。为什么这段代码合法?它不应该导致错误吗?如果不是,是否有这种解释的用途?

class SomeClass:
  x = 10

def Method():
  return SomeClass()

print(Method().x)  

#This line concerns me!
Method().x = 5


print(Method().x)  

2 个答案:

答案 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,并按照文档中的说明成功更改其值。