我通过让类构造函数调用多个函数来拆分类构造函数,如下所示:
class Wizard:
def __init__(self, argv):
self.parse_arguments(argv)
self.wave_wand() # declaration omitted
def parse_arguments(self, argv):
if self.has_correct_argument_count(argv):
self.name = argv[0]
self.magic_ability = argv[1]
else:
raise InvalidArgumentsException() # declaration omitted
# ... irrelevant functions omitted
当我的解释器愉快地运行我的代码时,Pylint有一个抱怨:
实例属性attribute_name定义在__init__之外
粗略的谷歌搜索目前没有结果。将所有构造函数逻辑保存在__init__中似乎是杂乱无章的,而且关闭Pylint警告也显得很笨拙。
python解决这个问题的方法是什么?
只需从parse_arguments()返回一个元组,并根据需要将其解压缩到__init__中的属性中。
另外,我建议你使用exception代替exit(1)。你得到了回溯,你的代码是可重用的,等等。
class Wizard:
def __init__(self, argv):
self.name,self.magic_ability = self.parse_arguments(argv)
def parse_arguments(self, argv):
assert len(argv) == 2
return argv[0],argv[1]
如果你正在使用python3,你可以试试
class Wizard:
def __init__(self, argv):
self.name: str = str()
self.magic_ability: str = str()
self.parse_arguments(argv)
self.wave_wand() # declaration omitted
def parse_arguments(self, argv):
if self.has_correct_argument_count(argv):
self.name = argv[0]
self.magic_ability = argv[1]
else:
raise InvalidArgumentsException() # declaration omitted
# ... irrelevant functions omitted
虽然不像公认的答案那样python化,但它应该可以摆脱Pylint警告。
如果你不关心类型,也不想用object()创建一个新对象,请使用:
class Wizard:
def __init__(self, argv):
self.name = type(None)()
# ...
因为None将导致类型不匹配错误。
解决这个问题的最佳实践是你需要首先在Init部分构建参数,
然后在Def中调整它
class MainApplication(tk.Frame):
def __init__(self, master):
self.master = master
tk.Frame.__init__(self, self.master)
self.settingsFrame = None
self.create_widgets(master)
def create_widgets(self, master):
# frame Container
self.settingsFrame = tk.Frame(self.master, width=500, height=30, bg='white')