我正在关注YouTube视频Learn Python through Data Hacking,并通过添加类来学习Python OOP的所有细节来扩展“遗留”内联方式。基本上视频中的那个人你可以抓住芝加哥公交线路的路线,解析它,然后通过比较纬度,长度,时间,距离等来找到他的朋友把手提箱放在哪辆公共汽车上。
我正在使用的XML文件包含许多值,如下所示:
<bus>
<id>1867</id>
<rt>22</rt>
<d>North Bound</d>
<dd>Northbound</dd>
<dn>N</dn>
<lat>41.89167051315307</lat>
<lon>-87.6297836303711</lon>
<pid>5421</pid>
<pd>Northbound</pd>
<run>P258</run>
<fs>Howard</fs>
<op>30090</op>
<dip>8858</dip>
<bid>7323012</bid>
<wid1>0P</wid1>
<wid2>258</wid2>
</bus>
从那里,我需要找到哪个巴士的纬度从他的位置向北(在课堂上定义,这个例子没有实际意义)。从这些节点,我正在创建一个Bus
对象,如下所示:
class Bus:
# The original XML node
__xml = None
# Our dictionary for properties to shadow a get() function on this object
__tree = {}
def __init__(self, busxml):
self.__xml = busxml
for e in busxml:
self.__tree[e.tag] = busxml.findtext(e.tag)
def gettree(self):
return self.__tree
# Tries to return prop, or returns None
def get(self, prop):
try:
return self.__tree[prop]
except KeyError:
return -1
def getall(self):
return self.__tree
从“main”文件中,我循环遍历值并根据lat
节点的文本值追加匹配:
# __getRouteData() is the url open and write function, works fine.
# parser is the xml.etree.ElementTree parse class
if self.__getRouteData() == True:
xmlParser = parser(self.__xmlFile)
busses = xmlParser.getnodes()
matches = []
# loop over all
for busTree in busses:
bus = Bus(busTree)
if float(bus.get('lat')) > self.__lat:
matches.append(bus)
print 'appending', bus.get('id')
for bus in matches:
print bus.get('id')
我遇到的障碍是在上面的第二个for
循环中。在第一个循环中,输出告诉我一切正常。第二个输出相同的值两次。它让我想起了Javascript for()
循环的行为,其中没有闭包,只对最后一个值起作用。我从控制台输出的内容如下:
appending 1784
appending 4057
4057
4057
请注意......它告诉我它将唯一的总线附加到我的matches
列表中,但是当我遍历matches
列表时,它只给我一辆公共汽车。
另一个片段告诉我第二个循环的时髦之处:
print 'Matches', matches
for bus in matches:
print bus.get('id')
# Matches [<busutils.Bus instance at 0xb6f92b8c>, <busutils.Bus instance at 0xb6f92d0c>]
# 4057
# 4057
列表的输出显示列表中对象的不同哈希值(......右?),因此说它们是两个不同的对象,因此具有不同的数据,但循环不能很好地播放
显然我刚刚进入python,但是有Java,Javascript,PHP等经验,所以我不确定在这些简单的循环中我缺少什么。
谢谢!
答案 0 :(得分:2)
这是因为你在Bus类上使用了类变量。使它们成为实例变量(在__init__
中创建)。