【发布时间】:2012-06-25 13:46:35
【问题描述】:
我怀疑类方法对某些变量集的作用与相应的非类函数的作用不同。这是一个例子。假设我们有一组变量:A、B、C,我们想根据一些算法随着时间的推移修改它们。有两种可能的实现方式:
1) 类:
class variables:
def __init__(self):
self.A = 0.0
self.B = 0.0
self.C = 0.0
def changeA(self):
self.A = some function of A, B and C
def changeB(self):
self.B = some function of A, B and C
def changeC(self):
self.C = some function of A, B and C
并多次调用:
ob = variables()
i = 0
while i<N:
ob.changeA()
ob.changeB()
ob.changeC()
i = i + 1
2) 没有类
A, B, C = 0.0, 0.0, 0.0
def changeA(A,B,C):
A = some function of A, B and C (same as in class method)
return A
def changeB(A,B,C):
B = some function of A, B and C (same as in class method)
return B
def changeC(A,B,C):
C = some function of A, B and C (same as in class method)
return C
并多次调用:
i = 0
while i<N:
A = changeA(A,B,C)
B = changeB(A,B,C)
C = changeC(A,B,C)
i = i + 1
在我看来,两种方法的结果必须相同。唯一的区别是变量 A、B 和 C 已知的命名空间(对象中的本地或函数实现的全局 - 但在这两种情况下,方法都可以访问所需的变量)。但是,两种方法的结果似乎不同。所以我的问题是在类方法实现/理解中我缺少什么吗?
更具体地说,一个实现方法changeA的例子:
作为类方法:
(... inside the class)
def changeA(self):
self.A = self.A + 2.0*self.B - 3.0*self.C*(self.B-self.A)
作为一个函数:
def changeA(A,B,C):
A = A + 2.0*B - 3.0*C*(B-A)
return A
【问题讨论】:
-
你有没有想过在课堂上每次使用 A、B 和 C 时都加上
self.前缀?否则,您将访问全局名称而不是本地名称。 -
是什么让您认为它们的行为不同?您能否发布一些显示差异的特定(工作)代码?
-
您在这两个示例中都没有定义类变量。在示例 (1) 中,您有一个具有三个实例属性(变量)的实例。
-
我添加了一些编辑来回答 Jonas Wielicki 和 lvc 的问题。致 msv:类变量是什么意思? A、B、C不是类变量吗?
标签: python class function methods scope