首页 > 解决方案 > python 3.9.4中的类在调用方法时给出不一致的属性错误

问题描述

在 Python 3.9.4 中,我构建了一个ForagerAgent包含许多方法的类。相关代码指的是两个不同的 ForagerAgent 对象之间的信息共享。相关代码示例:

class ForagerAgent:
    
    def __init__(self):
        heatmap = {}

    def receive_heatmap_knowledge(self, shared_data):
        
        received_alternative_indices = shared_data[0]
        received_alternative_data = shared_data[1]

        received_counter = 0
        while received_counter < len(received_alternative_indices):
            # add knowledge if the alternative is unknown
            received_index = received_alternative_indices[received_counter]
            received_data = received_alternative_data[received_counter]
            if isinstance(self.knowledge[received_index], int):
                self.knowledge[received_index] = received_data
            received_counter += 1

如果我从测试用例对象手动访问它,则会产生预期的结果:

from src.agents import ForagerAgent

forager_A = ForagerAgent()
forager_A.heatmap = {'stock_1': 100.0, 'stock_2': 0}
forager_A.update_list_of_knowns()

forager_B = ForagerAgent()
forager_B.heatmap = {'stock_1': 0, 'stock_2': 15}

data = forager_A.share_heatmap_knowledge() # method that yields knowledge as (['stock_1'], [100.0])
forager_B.receive_heatmap_knowledge(data)
print(forager_B.heatmap)

结果{'stock_1': 100.0, 'stock_2': 15}如预期的那样。

但是,当在另一个对象方法中调用此方法时,例如:

class DataSharer:
    def __init__(self):
        pass

    def share_knowledge(self, forager_a, forager_b):
        data = forager_a.share_heatmap_knowledge()
        forager_b.receive_heatmap_knowledge(data)


forager_a = ForagerAgent()
forager_a.heatmap = {'stock_1': 100.0, 'stock_2': 0}

forager_b = ForagerAgent()
forager_b.heatmap = {'stock_1': 0, 'stock_2': 15}

data_sharer = DataSharer()
data_sharer.share_knowledge(forager_a=forager_a, forager_b=forager_b)

它在错误和正常运行方面高度不一致。在其他一些类对象(如DataSharer上面的示例)中,它可以正常工作,而在其他一些类对象中,它会产生一个AttributeError: 'ForagerAgent' object has no attribute 'receive_heatmap_knowlegde'

有谁知道 Python 3.9.4 中可能导致这种不一致的任何常见(人为)错误或错误AttributeError?以及如何避免这种情况?

标签: python-3.xmethodsattributeerror

解决方案


推荐阅读