全局语句与整个类中可用的变量

时间:2009-09-28 12:08:47

标签: python

我试图避免python中的“全局”语句,而Do you use the "global" statement in Python?表明这是一个常见的观点。值通过其参数进入函数,并通过其返回语句(或读/写文件或异常或可能是我忘记的其他内容)来发布。

在一个类中,self.variable语句对于类的每个实例都是全局的。您可以在类中的任何方法中访问该变量。

我们应该避免在类中应用全局变量的相同原因,以便我们只应该在通过其参数进入的方法中使用值吗?我特别想到的长课程可能只是整个课程。类中固有的封装是否消除了这种担忧?无论如何,我们应该在评论中明确输入,输出和副作用吗?

3 个答案:

答案 0 :(得分:1)

self.variable对于类来说不是全局的,它对实例是全局的。这有很大的不同:

class MyClass:
    def __init__(self, a):
        self.a = a

mc1 = MyClass(1)
mc2 = MyClass(2)
assert mc1.a == 1
assert mc2.a == 2

您绝对应该使用self来封装类中的数据。

也就是说,绝对有可能创建巨大的过度生成的类,滥用实例变量可以滥用常规变量。这就是技能和工艺发挥作用的地方:将代码正确地划分为可管理的块。

答案 1 :(得分:1)

  

我们应该避免同样的原因   全局变量在类中应用,所以   我们应该只在方法中使用值   通过它的论点进来?   我特别想长   可以只是一个类的类   整个计划。

存在将行为与状态耦合的类。如果你拿走州的一部分(这是你的建议)那么你就不需要上课了。当然,这没有什么不妥 - 很好的软件是在没有面向对象的情况下编写的。

通常,如果您在创建课程时遵循Single Responsibility Principle,那么这些变量通常会由需要访问每个方法中的大部分或全部的类一起使用。您没有明确地传递它们,因为该类专门用于可以合理访问整个状态的行为。

换句话说,如果你发现自己的某个类在其许多方法中没有使用其一半变量,那么这可能表明你应该将它分成两个类。

答案 2 :(得分:-1)

理想情况下,不会使用任何实例范围的变量,并且所有内容都将作为参数传递并在注释中详细记录。话虽如此,评论每一件小事都会非常繁琐,方法参数列表可能会开始看起来很荒谬(除非你有部分应用方法的层次结构)。务实地说,应该在使用非局部变量和使所有内容变得非常明确之间寻求平衡。

至少有一种情况是你必须拥有实例级或类级变量,并且必须在方法调用之间保留特定于实现的值。

可伸缩性和并发性取决于最小化,如果不是完全消除状态和副作用,除了最本地和排除的运行时作用域。没有对象或显示类(即闭包)的OOP将是程序性的,是的。语言越来越多地成为多范式,但其中很多都有一个主要的范例。 C#是面向对象的功能特性。 F#可用于对象。

如果数据是不可变的,那么我的书中的实例变量总是没问题。