我在调用BaseSocketDataHandler
类函数时遇到属性错误,方法是将键名称中的字符串作为字符串,并在迭代self.method_name = getattr(self, "self.__process_" + key.lower().replace(" ", "_"))
AttributeError:'DataHandler'对象没有属性 '自我.__ 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
答案 0 :(得分:1)
这是因为“过程”前面有两个下划线。这称为名称修改。从python文档:
由于类私有成员有一个有效的用例(即 避免名字冲突的名称与子类定义的名称,在那里 对这种机制的支持是有限的,称为名称修改。的不限 形式__spam的标识符(至少两个前导下划线,at 大多数一个尾随下划线在文本上被替换为 _classname__spam,其中classname是当前的类名,其中前导下划线被剥离。这种破坏是不加考虑的 到标识符的句法位置,只要它发生 在一个类的定义内。