'Python type hint instance attribute with module not instantiated
Suppose we have the following class.
from docxtpl import DocxTemplate
from abc import ABC, abstractmethod
from typing import Dict, Any, Union
class MyClass(ABC):
def __init__(self, name: str, filename: Union[str, PathLike]) -> None:
""" Constructor """
self.name = name
self.filename = filename
self.template: DocxTemplate
def f1(self) -> None:
self.template = DocxTemplate(filename)
I want to type self.template
as DocxTemplate
but instantiate it later dynamically, in f1
. The point is that I am getting a warning in f1
that says:
Instance attribute template defined outside __init__
I don't really know why. I also tried to type self.template
as follows:
self.template: Optional[DocxTemplate] = None
But this forces my to check the existence of self.template in some parts of my code.
What point am I not understanding? How should it be correct?
Thanks and greetings!
Solution 1:[1]
You could try making self.template
a property
instead of an attribute
:
from docxtpl import DocxTemplate
from abc import ABC, abstractmethod
from typing import Dict, Any, Union
import os
class MyClass(ABC):
def __init__(self, name: str, filename: Union[str, os.PathLike]) -> None:
""" Constructor """
self.name = name
self.filename = filename
self.__template = None
@property
def template(self) -> DocxTemplate:
return self.__template
@template.setter
def template(self, value: DocxTemplate) -> None:
self.__template = value
return
@template.deleter
def template(self) -> None:
self.__template = None
return
def f1(self) -> None:
self.template = DocxTemplate(self.filename)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | David Camp |