我正在做一个任务,在这个任务中,我使用.csv中的行创建城市的“实例”,然后在计算距离和人口变化的方法中使用这些实例。创建实例很好(使用下面的步骤1-4),直到我尝试调用printDistance:
##Step 1. Open and read CityPop.csv
with open('CityPop.csv', 'r', newline='') as f:
try:
reader = csv.DictReader(f)
##Step 2. Create "City" class
class City:
##Step 3. Use _init method to assign attribute values
def __init__(self, row, header):
self.__dict__ = dict(zip(header, row))
##Step 4. Create "Cities" list
data = list(csv.reader(open('CityPop.csv')))
instances = [City(i, data[0]) for i in data[1:]]
##Step 5. Create printDistance method within "Cities" class
def printDistance(self, othercity, instances):
dist=math.acos((math.sin(math.radians(self.lat)))*(math.sin(math.radians(othercity.lat)))+(math.cos(math.radians(self.lat)))*(math.cos(math.radians(othercity.lat)))*(math.cos(math.radians(self.lon-othercity.lon)))) * 6300 (self.lat, self.lon, othercity.lat, othercity.lon)
当我在shell中输入instances[0].printDistance(instances1)时,得到错误:
`NameError: name 'instances' is not defined`
这是压痕问题吗?我应该从代码中调用函数,而不是从shell中调用吗?你知道吗
这与其说是一个缩进问题,不如说是一个一般的代码结构问题。你筑巢太多了:
printDistance
__init__
City
try
块的内部with
块内部我想这就是你想要做的:
try
和with
)你的
instances
不起作用的原因是,不像你想的那样,它可能没有被正确地创建,或者至少没有在正确的上下文中创建。而且由于所有的嵌套,您肯定无法在CLI上使用它。你知道吗你的代码中有很多明显的错误:
(self.lat, self.lon, othercity.lat, othercity.lon)
是什么?你知道吗reader
.csv
中的列标题指定为对象属性,但拼写错误(lat
而不是latitude
和lon
而不是longitude
)它看起来有点像在不同地方发现的许多代码被粘贴到一个块中-这就是清理时的样子:
注意
print_distance
现在是City
的一个方法,它在cities
中的City
的每个实例上被调用(这就是我将instances
重命名为的)。你知道吗现在,如果你真的在努力,这就更有意义了:
请注意清理的计算、捕获可能发生的错误(在
with
块中有try
)和一个适当的构造函数,该构造函数用正确的类型分配它所需的内容,同时读取器决定哪些字段放在哪里。你知道吗最后,作为一个额外的好处:没有人应该写这样的距离计算。有很多图书馆在这方面做得更好,比如GeoPy。你所需要做的就是
pip install geopy
得到它,然后你就可以使用这个:注意,我也将
print
移出了方法,因为在对象中计算并在对象外打印更有意义。所有这一切的好处是,现在的计算使用一个适当的测地线(WGS-84)来做计算和数学错误的几率大大降低。如果您必须使用一个简单的球体,库中也有相应的函数。你知道吗嵌套函数不能包含self作为参数,因为它们不是成员函数。类无法将实例变量传递给它们。你实际上是在把同一个自我从父函数传递给子函数。你知道吗
另外,您不能嵌套构造函数,这仅用于初始化目的。创建一个单独的方法。你知道吗
并尝试在构造函数中创建实例变量,这就是init的目的!你知道吗
同时为实例化创建单独的函数
相关问题 更多 >
编程相关推荐