2017-01-15 33 views
-1
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)

我得到以下錯誤:

if Street.valid_house_to_add(house)==True: TypeError: unbound method valid_house_to_add() must be called with Street instance as first argument (got HouseLocation instance instead)

我還是新的類,因此,如果任何人都可以指導我還是告訴我該怎麼解決這個問題會是問題真的很感激

回答

4

要訪問的方法直上類:

if Street.valid_house_to_add(house)==True: 

表達Street.valid_house_to_add檢索來自類未結合方法,這意味着它不與實例相關聯。

訪問上self的方法來代替,這樣勢必self

if self.valid_house_to_add(house): 

請注意,您不需要添加== Trueif已經測試爲真值。

你也不應該從每種方法調用HouseLocation.__init__。你大概想打電話那隻從Street.__init__。實際上,我會說Street應該是一個容器,持有HouseLocation實例,而不是它的子類。如果Street是專門的HouseLocation,則僅使用子類別。

+0

實際上,它被要求爲'valid_house_to_add()'和'add_house'函數使用HouseLocation,我會檢查你的答案並返回 – Enigma

+0

@Enigma:聽起來好像你的'Street'對象應該*包含*'HouseLocation'實例,而不是'HouseLocation'的子類。 –

+0

請求:'valid_house_to_add()' - 此函數接收'HouseLocation'類型的對象作爲參數 *從另一種語言粗略翻譯 – Enigma