避免使用" global"在每一个功能

时间:2014-05-08 23:30:29

标签: python global-variables

Python应该是有趣,简单且易于学习的。

相反,这是一个巨大的痛苦。

我发现我得到的所有错误都与我无关,并未在每个函数中声明每个变量的全局变量。

因此,对于dressUp的玩具程序,我必须写一下:

hatColor = ""
shirtColor = ""
pantsColor = ""

    def pickWardrobe(hat, shirt, pants):
         global hatColor
         global shirtColor
         global pantsColor
         ...

当我有20个函数时,这真的很烦人,每个函数在开始时需要有20个全局声明。

有什么方法可以避免这种情况吗?

谢谢!

ADDED

我得到了大量的`UnboundLocalError - 在赋值之前引用了局部变量X.

为什么我这样做?因为我需要编写一个py文件,可以为我做一些计算。我不想在同一个功能中使用它,或者它变得混乱,我无法重用代码。但是,如果我将工作分成几个函数,我必须一遍又一遍地声明这些恼人的全局变量。

3 个答案:

答案 0 :(得分:1)

类与全局变量

global对所有

都很常见

class是一个对象的模板,代表一些东西,在这里它可能是某人打扮的人。

类可能具有类属性,这些属性并不常用,因为它们由所有实例共享(类似于“全局类”)。

一旦实例化,类就会开始生效,这意味着,类定义定义的模式是以唯一对象的形式实现的。

这样一个名为instance的对象可能拥有它自己的属性,这些属性不与其他实例共享。

我有时会想到一个类,因为can-class定义意味着“可以将东西放进去”,而实例是真正有形的,它有一个名称,在Python中我将属性值放入其中,这与给定的持有人的名字绑定。

具有真实实例属性的DressUp类

“holmeswatson”解决方案中的属性与类定义绑定。如果你要使用多个DressUp实例,你会遇到问题,他们会在类定义上共享属性。

将它用作实例变量更好更安全,实例变量超过self绑定到类的实例,而不是类定义。

修改后的代码:

class DressUp:

    def __init__(self, name, hatColor="", shirtColor=""):
        self.name = name
        self.hatColor = hatColor
        self.shirtColor = shirtColor

    def pickWardrobe(self,hat, shirt):
        self.hatColor = hat
        self.shirtColor = shirt

    def __repr__(self):
        name = self.name
        hatColor = self.hatColor
        shirtColor = self.shirtColor

        templ = "<Person:{name}: hat:{hatColor}, shirt:{shirtColor}>"
        return templ.format(name=name, hatColor=hatColor, shirtColor=shirtColor)


tom = DressUp("Tom")

tom.pickWardrobe("red","yellow")
print "tom's hat is", tom.hatColor
print "simple print:", tom
print "__repr__ call:", tom.__repr__()

jane = DressUp("Jane")

jane.pickWardrobe("pink","pink")
print "jane's hat is", jane.hatColor
print "simple print:", jane
print "__repr__ call:", jane.__repr__()

目前使用的是__repr__方法,您可以拨打print tomprint jane

这里用来表示,如何实例方法可以访问实例属性。

答案 1 :(得分:1)

周围有什么办法吗?是的,有几个。如果您经常使用全局变量,那么您的设计就会出错。

当你有许多函数对一个相同的相关数据进行操作时,一种常见的模式是创建一个类,然后声明该类的实例。每个实例都有自己的一组数据和方法,该实例中的方法可以对该实例中的数据进行操作。

这称为面向对象编程,它是现代编程中常见的基本范例。

一些受访者已经勾勒出了一个类在你的案例中的样子,但我认为你没有提供足够的信息(包括其他功能的方法签名)来实际写出你需要的东西。如果您发布更多信息,可能会得到一些更好的例子。

答案 2 :(得分:-1)

如果合适,可以使用类。

class DressUp:

  def __init__(self, name):
    self.name = name

  def pickWardrobe(self,hat, shirt, pants):
    self.hatColor = hat
    self.shirtColor = shirt
    self.pantsColor = pants


 obj1 = DressUp("Tom")

 obj1.pickWardrobe("red","yellow","blue")
 print obj1.hatColor

看看: http://www.tutorialspoint.com/python/python_classes_objects.htm