def isBetween(a, b, c):
crossproduct = (c[1] - a[1]) * (b[0] - a[0]) - (c[0] - a[0]) * (b[1] - a[1])
if abs(crossproduct) != 0 : return False
dotproduct = (c[0] - a[0]) * (b[0] - a[0]) + (c[1] - a[1])*(b[1] - a[1])
if dotproduct < 0 : return False
squaredlengthba = (b[0] - a[0])*(b[0] - a[0]) + (b[1] - a[1])*(b[1] - a[1])
if dotproduct > squaredlengthba: return False
return True
class HouseLocation(object):
def __init__(self,street_name,x,y):
self.street_name=street_name
self.x=x
self.y=y
def print_address(self):
print '{}: {},{}'.format(self.street_name,self.x,self.y)
class Street(HouseLocation):
def __init__(self,street_name,map_symbol,street_ends):
if len(map_symbol)>1:
raise ValueError('The map_symbol should be only one letter!')
if map_symbol==str.upper(map_symbol):
raise ValueError('Make sure that the map_symbol is a small letter!')
house_locations={}
global x1,x2,y1,y2
x1=street_ends[0][0]
x2=street_ends[1][0]
y1=street_ends[0][1]
y2=street_ends[1][1]
def valid_house_to_add(self, house):
HouseLocation.__init__(house,house.street_name,house.x,house.y)
ava=isBetween((x1,y1),(x2,y2),(house.x,house.y))
return ava
def add_house(self,house):
HouseLocation.__init__(house,house.street_name,house.x,house.y)
if Street.valid_house_to_add(house)==True:
house_locations.update(house,house.x,house.y)
else:
raise ValueError("Can not add {} to map").format(house)
代码尚未完成,但到目前为止,我在上一个函数add_house
中遇到了问题
当我在shell中运行以下命令时:
mockingbird = Street(“mockingbird lane”,“m”,((5,36),(30,36)))
frat_house = HouseLocation(“mockingbird lane”,11,36)
bad_house = HouseLocation(“mockingbird lane”,31,36)
mockingbird.add_house(my_house)
print mockingbird.valid_house_to_add(frat_house)
我收到以下错误:
如果Street.valid_house_to_add(house)== True: TypeError:未绑定方法valid_house_to_add()必须使用Street实例作为第一个参数调用(而不是使用HouseLocation实例)
我还是新上课,所以如果有人可以指导我或告诉我如何解决那些真正受到重视的问题
答案 0 :(得分:4)
您正在课堂上直接访问该方法:
if Street.valid_house_to_add(house)==True:
表达式Street.valid_house_to_add
从类中检索未绑定的方法,这意味着它与实例无关。
改为访问self
上的方法,以便绑定到self
:
if self.valid_house_to_add(house):
请注意,您无需为真值添加== True
,if
已测试。
您也不应该从每种方法中调用HouseLocation.__init__
。您可能只想从Street.__init__
拨打该电话。事实上,我说Street
应该是容器,持有HouseLocation
个实例,而不是它是一个子类。如果Street
是专门的HouseLocation
,则仅使用子类化。