Python 使用类TypeError:未绑定方法

Python 使用类TypeError:未绑定方法,python,function,class,Python,Function,Class,代码尚未完成,但到目前为止,我在上一个函数add_house中遇到了一个问题 在shell中运行以下命令时: 嘲鸟街嘲鸟巷,m,5,36,30,36 frat_house=house Location Mockingbird lane,11,36 bad_house=house Location Mockingbird lane,31,36 知更鸟。加上我的房子 打印mockingbird.valid\u house\u to\u addfrat\u house 我得到以下错误: if Stre

代码尚未完成,但到目前为止,我在上一个函数add_house中遇到了一个问题 在shell中运行以下命令时:

嘲鸟街嘲鸟巷,m,5,36,30,36

frat_house=house Location Mockingbird lane,11,36

bad_house=house Location Mockingbird lane,31,36

知更鸟。加上我的房子

打印mockingbird.valid\u house\u to\u addfrat\u house

我得到以下错误:

if Street.valid\u house\u to\u addhouse==真: TypeError:必须使用Street实例调用有效的unbound方法\u house\u to\u add,因为第一个参数改为获得HouseLocation实例


我还是新手,因此如果有人能指导我或告诉我如何解决问题,我会非常感激的

您可以直接在课堂上访问该方法:

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)
表达式Street.valid_house_to_add从类中检索未绑定的方法,这意味着它与实例不关联

改为在self上访问该方法,以便将其绑定到self:

请注意,如果已经测试了真值,则不需要添加==True


您也不应该从每个方法调用HouseLocation.\uuuu init\uuuuu。你可能只想在街上叫它。事实上,我认为Street应该是一个容器,包含HouseLocation实例,而不是一个子类。如果街道是专门的房屋位置,则仅使用子类化。

实际上,对于有效的“房屋”添加和“房屋添加”功能,要求使用房屋位置,我将检查您的答案并与您联系back@Enigma:听起来好像街道对象应该包含HouseLocation实例,并且不是HouseLocation的子类。请求的内容:valid_house_to_add-此函数接收HouseLocation类型的对象作为参数*从另一个对象进行粗略转换language@Enigma:对,所以Street不是HouseLocation的子类。正如列表不是int的子类一样,您可以调用list.append将整数添加到列表中。@Enigma:Street.add\u house方法只接受HouseLocation实例并访问它定义的属性。这不需要HouseLocation.\uuuuu init\uuuuuuuuu被调用。
 if Street.valid_house_to_add(house)==True:
 if self.valid_house_to_add(house):