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 的实例方法,具有以下属性:
- 不重写 master 中的文档字符串或签名 class
- 让
autodoc
解析来自其他 class 的文档字符串,就好像它们是主文档的文档字符串一样 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
,我必须:
- 手动复制签名
- 手动复制文档字符串(因为我希望我的 Sphinx 文档准确无误)
- 在
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的特例。
我有一个 class(我将其称为 "master class"),它使用多个其他 classes 的实例方法。其他 classes 在 __init__
上导入并存储为私有实例属性。
我想使用其他 class 的实例方法,具有以下属性:
- 不重写 master 中的文档字符串或签名 class
- 让
autodoc
解析来自其他 class 的文档字符串,就好像它们是主文档的文档字符串一样 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
,我必须:
- 手动复制签名
- 手动复制文档字符串(因为我希望我的 Sphinx 文档准确无误)
- 在
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的特例。