Python应该是有趣的,简单易学的。
相反,这是一个巨大的痛苦。
我发现我得到的所有错误都与我没有在每个函数中声明每个变量全局有关。
对于我的玩具程序dressUp
,我必须写:
hatColor = ""
shirtColor = ""
pantsColor = ""
def pickWardrobe(hat, shirt, pants):
global hatColor
global shirtColor
global pantsColor
...
当我有20个函数时,这真的很烦人,每个函数都需要在开始时有20个全局声明。
有办法避免这种情况吗?
谢谢!
添加我得到了大量的' UnboundLocalError -分配前引用的局部变量X。
我为什么要这样做?因为我需要写一个py
文件,可以为我做一些计算。我不希望它们都在同一个函数中,否则会变得很乱,我不能重用代码。但是,如果我将工作拆分为几个函数,我就必须一遍又一遍地声明这些烦人的全局变量。
类与全局变量
global
为所有
class是一个对象的模板,它代表一些东西,在这里它可以是一个装扮过的人。
类可能有类属性,这些不太常用,因为它们被所有实例共享(有点像"类的全局")。
类在你实例化它们的时候就开始存在了,这意味着,由类定义定义的模式是以唯一对象的形式实现的。
这样一个对象,叫做instance,可能有它自己的属性,这些属性不与其他实例共享。
我有时会把类想象成罐头——类的定义意味着"罐头是你可以放东西进去的东西",而实例是真正有形的罐头,它有一个名字,在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 tom
或print jane
。
这里用来说明实例方法如何访问实例属性
有没有别的办法?是的,有几个。如果你经常使用全局变量,你就在设计中犯了一个错误。
当您有许多函数将操作相同的相关数据时,一个常见的模式是创建一个类,然后声明该类的实例。每个实例都有自己的一组数据和方法,该实例中的方法可以对该实例中的数据进行操作。
这被称为面向对象编程,它是现代编程中常见的基本范式。
几个受访者已经勾勒出了你的例子中的类可能是什么样子,但我认为你没有给出足够的信息(包括其他函数的方法签名)来实际写出你需要的东西。如果你发布更多信息,你可能会得到一些更好的例子。
如果合适的话,您可以使用类。
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