使用类TypeError:unbound方法

2024-04-26 23:04:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

我还是个新手,所以如果有人能指导我或者告诉我如何解决这个问题,我会非常感激的


Tags: tonameselfaddstreetmapreturnif
1条回答
网友
1楼 · 发布于 2024-04-26 23:04:28

您直接在类上访问方法:

 if Street.valid_house_to_add(house)==True:

表达式Street.valid_house_to_add从类中检索unbound方法,这意味着它与实例没有关联。你知道吗

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

 if self.valid_house_to_add(house):

注意,您不需要为真值添加== Trueif测试。你知道吗

您也不应该从每个方法调用HouseLocation.__init__。您可能只想从Street.__init__调用它。实际上,我想说Street应该是一个容器,包含HouseLocation实例,而不是一个子类。仅当Street是专门的HouseLocation时才使用子类。你知道吗

相关问题 更多 >