Python classes: 一个 class 中的实例方法指向另一个 class 中的实例方法

Python classes: having instance method in one class point to instance method in another class

我有一个 class(我将其称为 "master class"),它使用多个其他 classes 的实例方法。其他 classes 在 __init__ 上导入并存储为私有实例属性。

我想使用其他 class 的实例方法,具有以下属性:

目前,我的设置方式:

class OtherClass:
    """Some other class that I import."""

    def __init__(self):
        pass

    def print_num(self, num: float = 15) -> None:
        """Print a num.

        Args:
            num: Number to print

        """
        print(num)

from .other import OtherClass


class MasterClass:

    def __init__(self, other_class: OtherClass):
        """Create master class with a bunch of other classes.

        For simplicity, I only included one class here as an arg.

        Args:
            other_class: Houses some methods

        """
        self._other_class = other_class

    def print_num(self, num: float = 15):
        """Print a num.

        Args:
            num: Number to print

        """
        self._other_class.print_num(num)

要拉入 OtherClass.print_num,我必须:

  1. 手动复制签名
  2. 手动复制文档字符串(因为我希望我的 Sphinx 文档准确无误)
  3. MasterClass的方法中调用OtherClass的方法,手动传入所有args和kwargs

有更好的方法吗?

预先感谢您的指导。

函数wraps from the module functools就是你所需要的:

from functools import wraps

class OtherClass:
    def print_num(self, num: float=15) -> None:
        """Print a num.

        Args:
            num: Number to print

        """
        print(num)

class MasterClass:
    def __init__(self, other_class: OtherClass):
        self._other_class = other_class

    @wraps(OtherClass.print_num)
    def print_num(self, num=15):
        self._other_class.print_num(num)

print(MasterClass.print_num.__doc__)
print(MasterClass.print_num.__annotations__)

输出:

Print a num.

        Args:
            num: Number to print


{'num': <class 'float'>, 'return': None}

您仍然需要进行显式调用。

注意:您的设计是facade pattern的特例。