Python - 应该将类属性作为局部变量传递给类方法吗?

时间:2014-02-22 19:51:27

标签: python class methods

我一直在努力尝试理解课程和OOP。我看过herehere,但我认为我的问题更基本。我的理解是,在过程代码中,最好将变量传递给函数并添加到本地名称空间而不是访问全局变量(应该显式声明)。但我看到很多引用,其中类方法直接引用实例属性。例如:

#procedural approach with local namespace
a = 5
def my_local_func(a):
    return a + 1

#procedural approach with global variable
a = 5
def my_global_func():
    global a
    return a + 1

#but it doesn't seem necessary in examples about classes
class MyClass(object):
    def __init__(self):
        self.a = 5

    def dosomething(self):
        return self.a + 1

在我看来,类命名空间只是全局命名空间的一个子集,因此我不清楚为什么规则或至少约定会在这种情况下发生变化。我真正关心的是使用传递的实例属性通过属性装饰器创建更复杂的实例属性:

class MyClass(object):
    def __init__(self)
        self.a = 5
        self.b = 1

    @property
    def c(self):    
    return self.a + self.b

    @c.setter
    def c(self, value):
        self.b = value
        return self.a + self.b

实际上,现在我考虑一下,我将整个self对象传递给方法。因此,在这种情况下,对象被复制到方法(本地)命名空间,其属性也是如此,它恰好与实例命名空间中的属性具有相同的名称。如果我正确地考虑这个问题,我会很感激,让我知道。我不能成为唯一一个对此感到疑惑的人。

1 个答案:

答案 0 :(得分:0)

好的,我现在明白了。感谢大卫的评论。

在我读过课程的书中,它说类方法需要自我添加,但它不能解释原因。当我在引用self.a或self.b的方法中看到引用时,我假设它直接引用了实例名称空间,因为我没有想过将名为self的对象传递给方法的含义。因此,对象的引用被传递到本地名称空间,并且该方法正在进行本地引用,这与全局名称空间中函数的行为一致。

提出这个问题很有帮助 - 抱歉,如果我浪费了任何人的时间阅读它。