Код: Выделить всё
def __generate_validation_attributes__(self) -> None:
_dir = Path(__file__).parent
# Get list of subdirectories in my_dir
subdirectories = [d for d in my_dir.iterdir() if d.is_dir()]
for subdir in subdirectories:
subclass_name = subdir.name
subclass = type(subclass_name, (), {})
subclass.__doc__ = f"subdirectory {subclass_name}"
# List of Python files in the subdirectory, excluding __init__.py
py_files = [f for f in subdir.glob("*.py") if f.name != "__init__.py"]
for py_file in py_files:
# Get module name including package
module_relative_path = py_file.relative_to(subdirectories)
module_name = ".".join(module_relative_path.with_suffix("").parts)
# Import the module from the file path
spec = importlib.util.spec_from_file_location(
module_name,
py_file,
)
module = importlib.util.module_from_spec(spec)
# Find classes defined in the module
classes_in_module = inspect.getmembers(
module,
lambda member: inspect.isclass(member)
and member.__name__.lower() == py_file.stem.replace("_", "").lower(),
)
for _, class_obj in classes_in_module:
# Attach the method to the subclass
self.validation_classes[class_obj.__name__] = class_obj
setattr(
subclass,
class_obj.__name__,
self. __make_method__(class_obj),
)
# Attach the subclass to the parent class
setattr(self, subclass_name, subclass())
def __make_method__(self, class_obj: type) -> Callable[..., Validate]:
def validation_method(*args, **kwargs) -> Validate:
return self.__create_validation_class__(
class_obj,
*args,
**kwargs,
)
validation_method.__name__ = class_obj.__name__
validation_method.__doc__ = class_obj.__doc__
return validation_method
Код: Выделить всё
cls = MyClass()
cls.subdirectory.ChildClass("bla")
Есть ли лучший вариант для достижения желаемого результата?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ed-methods