【问题标题】:python class method different from non-class functionpython类方法不同于非类函数
【发布时间】: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


【解决方案1】:

我想说的是,在第一种情况下,每次创建一个新的 variables 实例时,ABC 的值都会被重置,而第二种方法的情况并非如此它们似乎是全球性的。根据您使用这些实例的方式,结果可能会受到影响。

编辑:在评论中OP的问题之后,这里是如何定义类变量:

>>> class Variables:
    A = 0.0
    B = 0.0
    C = 0.0

    def changeA(self):
           Variables.A = Variables.A + Variables.B * Variables.C


>>> v = Variables()
>>> v.changeA()
>>> v.A
0.0
>>> Variables.A
0.0
>>> 

如您所见,不再需要定义__init__ 方法。您可以通过instance.Aclass.A 访问这些变量。

【讨论】:

  • 如何使类变量 A、B 和 C 在类中成为全局变量(就像在 c++ 中一样)?我的目标是修改一些全局变量,而不是在每次迭代时重置它们。这在函数实现中似乎很简单,但是在类实现中如何做到这一点?
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2014-10-28
  • 2022-11-03
  • 2022-08-23
相关资源
最近更新 更多