我有以下Python:
class CollectorGUI(Gtk.Window):
def __init__(self, prefill, flags, data_to_return):
"""prefill should be an instance of the Prefill class"""
self.prefill = prefill
self.flags = flags
self.data_to_return = data_to_return
......
我的问题是:(1)如何摆脱文档字符串?我希望我的代码能够自我记录; (2)如何摆脱这三条线:
self.prefill = prefill
self.flags = flags
self.data_to_return = data_to_return
是否有缩写?
答案 0 :(得分:4)
Prefill
要求
class CollectorGUI(Gtk.Window):
def __init__(self, prefill: Prefill, flags, data_to_return):
注释在运行时是可发现的,就像文档字符串一样。注释不是强制执行的(它们是不同用例的更通用的垫脚石),但在签名中立即显而易见。
然后,您可以选择asserting the type明确强制执行它:
assert isinstance(prefill, Prefill), 'prefill must be an instance of Prefill'
至于从函数参数中自动设置属性,这在其他地方得到了解答:What is the best way to do automatic attribute assignment in Python, and is it a good idea?
答案 1 :(得分:0)
虽然您可以使用inspect来自动地从方法签名中的参数创建属性,但它会混淆您现在拥有的完全可读的代码。 看一下构造函数告诉我该类至少具有prefill,flags和data_to_return属性。
隐式显式代码通常不是一个好主意。
但如果你坚持:
import inspect
class C(object):
def __init__(self, a, b, c):
spec = inspect.getargspec(getattr(C, "__init__"))
for arg in spec.args[1:]:
setattr(self, arg, locals()[arg])
c = C(1, 2, 3)
print c.a
print c.b
print c.c