【问题标题】:Python throws Attribute Error for base class method in inherited class [duplicate]Python为继承类中的基类方法抛出属性错误[重复]
【发布时间】:2015-12-16 12:05:21
【问题描述】:

我在调用BaseSocketDataHandler 类函数时遇到如下属性错误,方法是从键名中获取字符串作为字符串,并在迭代info_dict_map 时使用self.method_name = getattr(self, "self.__process_" + key.lower().replace(" ", "_")) 将其转换为方法名

AttributeError: 'DataHandler' 对象没有属性 'self.__process_info'

我不明白为什么会收到此错误。通过字符串调用函数是正确的方法,还是我应该做其他事情?

class BaseSocketDataHandler(object):
    def __init__(self, sql_address, sql_user, sql_pswd, sql_db_name):
        .....
        self.db_connector = MySqlConnector(address=sql_address, suser=sql_user, spwd=sql_pswd, db_name=sql_db_name)
        .....
        self.info_dict = dict()
        self.info_dict_map = {"date_time": (0, 12), "info_len": (12, 13), "info": (13, 14), "reserved": (36, 37)}
        self.hex_data_dict = {"data_content": "0123456789abcdef10111213141516171819"

    @staticmethod
    def __convert_to_int(data):
        return int(data, 16)

    @staticmethod
    def __process_reserved(data):
        return data

    def __process_date_time(self, date_time_in_hex):
        date_time = tuple()
        for x in date_time_in_hex:
            date_time += self.__convert_to_int(x)
        return date_time

    def __process_info_len(self, info_len):
        return self.__convert_to_int(info_len)

    def __process_info(self, info):
        return self.__convert_to_int(number_of_sat)

    def make_info(self):
        for key, val in self.info_dict_map.items():
            method_name = getattr(self, "self.__process_" + key.lower().replace(" ", "_"))
            key_var = key
            setattr(self, key_var, method_name(self.hex_data_dict["data_content"][val[0]: val[1]]))
            self._info_dict.update({key: key_var})
            self.method_name = None




class DataHandler(BaseSocketDataHandler):
    def __init__(self):
        super(DataHandler, self).__init__(sql_address, sql_user, sql_pswd, sql_db_name)

    def run_forever(self):
        while True:
            try:
                self.make_info()
            except Exception as uee:
                self.log.exception(self._log_msg(uee))
                break

【问题讨论】:

标签: python function methods iteration attributeerror


【解决方案1】:

这是因为“进程”前面有两个下划线。这称为名称修改。来自python文档:

由于类私有成员有一个有效的用例(即 避免名称与子类定义的名称发生名称冲突),有 对这种机制的支持有限,称为名称修改。 任何 __spam 形式的标识符(至少两个前导下划线,在 大多数尾随下划线) 在文本上替换为 _classname__spam,其中 classname 是当前类名,去掉了前导下划线。这种修改是不加考虑的 到标识符的句法位置,只要它出现 在类的定义中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2011-12-08
    相关资源
    最近更新 更多