这两个代码块都工作。有“正确”的方法吗?
class Stuff:
def __init__(self, x = 0):
global globx
globx = x
def inc(self):
return globx + 1
myStuff = Stuff(3)
print myStuff.inc()
打印“4”
class Stuff:
def __init__(self, x = 0):
self.x = x
def inc(self):
return self.x + 1
myStuff = Stuff(3)
print myStuff.inc()
还打印“4”
我是个新手,我在一个类中处理很多变量。开始想我为什么要把“自我”摆在眼前。
谢谢你的帮助!
“类作用域变量”有两种方法。一种是使用
self
,这称为实例变量,类的每个实例都有自己的实例变量副本;另一种是在类定义中定义变量,可以通过以下方法实现:这称为类属性,它可以由
Stuff.globx
直接访问,并由类拥有,而不是类的实例,就像Java中的静态变量一样。不应该对“类作用域变量”使用
global
语句,因为它不是。声明为global
的变量在全局范围内,例如定义类的模块的命名空间。namespace and related concept is introduced in the Python tutorial here.
您应该使用第二种方法,然后每个实例都有一个单独的
x
如果使用全局变量,那么当有多个
Stuff
实例时,可能会得到令人惊讶的结果,因为更改其中一个实例的值将影响所有其他实例。在Python代码中到处都是显式self是正常的。如果您尝试一些技巧来避免这一点,那么您将使您的代码难以为其他Python程序员阅读(并且可能会引入额外的bug)
它们在语义上是非常不同的。
self.
表示它是一个实例变量,即每个实例都有自己的实例。这显然是最常见的一种,但不是唯一的一种。然后是类变量,在类级别定义(因此在执行类定义时)并且可以在类方法中访问。相当于大多数静态方法的使用,以及当你需要在实例之间共享东西时,你最想要的东西(这是完全有效的,尽管对于给定的问题不是自动的唯一方法)。你当然想要一个,这取决于你在做什么。真的,我们不能读懂你的心思,告诉你哪一个适合你的问题。全局变量是另一回事。他们是全球性的每个人都有一个。这几乎不是一个好主意(原因在很多场合都有解释),但如果你只是写一个快速而肮脏的脚本,需要在几个地方共享一些东西,它们是可以接受的。
相关问题 更多 >
编程相关推荐