Почему не работает динамическое добавление функции в импортированный класс в python 3?

Имею Python 3.2.3

если делаю так:
def copy_table(self):
    print('aaa')

class T:
    pass

T.copy_table = copy_table
b = T()
b.copy_table()
---------OUTPUT------------
'aaa'

Все работает как часы.

но если я делаю тоже самое, но над классом, который я беру из модуля (если конкретнее - класс Document из python-docx) то вызов не получается.
import docx
docx.Document.copy_table = copy_table
doc = docx.Document('doc.docx')
doc.copy_table()
---------OUTPUT------------
AttributeError: 'Document' object has no attribute 'copy_table'


Что я делаю не так?
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
@766dt
Почитал документацию, там написано:
Document constructor
docx.Document(docx=None): ...

Открыл исходники, там действительно:
def Document(docx=None): 
    ...


Если кратко, то docx.Document это не сам класс, а функция, которая вернет какой-то объект, и если к этой функции приделать атрибутом еще одну функцию, то созданный объект о ней ничего знать естественно не будет.

Возможно можно просто прикреплять функцию к docx.document.Document, но не проще унаследоваться?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы