Python 3: Наследование объекта листа, объект ошибки не имеет атрибута 'dict_reader' - PullRequest
0 голосов
/ 05 августа 2020
Я хочу добавить новый метод в Sheet Object (пакет xlrd), вот код (в файле Sheet.py):
from xlrd.sheet import Sheet
class Sheet(Sheet):
    def dict_reader(self, fieldnames):
        list_dict = []
        for i, _ in enumerate(range(self.nrows)):
            temp_dict = {}
            for j, _ in enumerate(range(self.ncols)):
                temp_dict.update(fieldnames[j], self.cell_value(i, j))
            list_dict.append(temp_dict)
        return list_dict

Проблема в том, что когда я вызываю метод, он дает мне AttributeError: У объекта «Лист» нет атрибута «dict_reader» . В файле, который я хочу использовать (file.py), код выглядит примерно так:

import xlrd
from ..sheet import Sheet
workbook = xlrd.open_workbook(filename)
worksheet = workbook.sheet_by_index(0)
reader = worksheet.dict_reader(columns)

В файле init .py:

from . import Models_directory

Моя структура каталогов примерно такая (да, это архитектура каталогов модуля Odoo):

Main_directory
    Sheet.py
    Models_directory
        file.py
    __init__.py

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Неразумно иметь одно и то же имя для вашего класса и класса, который вы импортировали из внешнего модуля. Используйте что-то вроде MySheet, и проблема будет решена, если Sheet или MySheet имеют обязательный атрибут dict_reader.

0 голосов
/ 05 августа 2020

Это не использует ваш класс. Рабочий лист, возвращаемый workbook.sheet_by_index (0), не является вашим классом Sheet, а оригиналом. Чтобы поместить свой метод в этот конкретный экземпляр Sheet, вы можете:

import xlrd
import types

def dict_reader(self, fieldnames):
    list_dict = []
    for i, _ in enumerate(range(self.nrows)):
        temp_dict = {}
        for j, _ in enumerate(range(self.ncols)):
            temp_dict.update(fieldnames[j], self.cell_value(i, j))
        list_dict.ap

workbook = xlrd.open_workbook(filename)
worksheet = workbook.sheet_by_index(0)
worksheet.dict_reader = types.MethodType(dict_reader,worksheet)
reader = worksheet.dict_reader(columns)

Но это по-прежнему не выполняется, потому что столбцы не определены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...