Python - 在 __init__() 之外定义的实例属性
Python - instance attribute defined outside __init__()
我收到以下代码的相关警告:
from tkinter import *
from tkinter import ttk
class Autocomplete(Frame, object):
def __init__(self, *args, **kwargs):
super(Autocomplete, self).__init__(*args, **kwargs)
self.list = []
def build(self, width, height, entries):
# I get the warning for the following 8 lines:
self._entries = entries
self.listbox_height = height
self.entry_width = width
self.text = StringVar()
self.entry = ttk.Entry(self, textvariable=self.text, width=self.entry_width)
self.frame = Frame(self)
self.listbox = Listbox(self.frame, height=self.listbox_height, width=self.entry_width)
self.dropdown = Listbox(self.frame, height=self.listbox_height, width=self.entry_width, background="#cfeff9",
takefocus=0)
self.entry.pack()
self.frame.pack()
self.listbox.grid(column=0, row=0, sticky=N)
self.dropdown.grid(column=0, row=0, sticky=N)
self.dropdown.grid_forget()
return self
root = Frame(Tk())
autocomplete = Autocomplete(root).build(74, 10, entries)
root.pack()
autocomplete.pack()
mainloop()
我应该如何解决这个问题?我试图将所有内容移动到 init,但随后我在创建 Autocompelete 对象的行中传递参数时遇到了一些错误。因此,请向我提供我必须进行的所有更改。不仅仅是你必须移动它们。
我可以通过添加 8 个定义行来修复警告,将 None 分配给所有变量,但我认为这是一个愚蠢的解决方案。那么正确的做法是什么?
请记住,并非所有警告都需要修复,这一点始终很重要。警告只是警告。他们应该指出代码的特定部分,因为它是 "common" 问题的根源。但有时你 need/want 会那样做。
I could fix the warning by adding 8 definition lines assigning None to all the variables
这只是 "silencing" 警告,在我看来,这与忽略警告一样好。
So what is the right thing to do?
正确的方法是只使用 __init__
。我做了一个快速测试,我没有任何问题。
然而,这只是一个如何做到这一点的例子。我还没有检查 Frame
想要什么作为 __init__
的参数,所以它可能会导致冲突:
from tkinter import *
from tkinter import ttk
class Autocomplete(Frame, object):
def __init__(self, *args, **kwargs):
width, height, entries = kwargs.pop('width'), kwargs.pop('height'), kwargs.pop('entries')
super(Autocomplete, self).__init__(*args, **kwargs)
self.list = []
self._entries = entries
self.listbox_height = height
self.entry_width = width
self.text = StringVar()
self.entry = ttk.Entry(self, textvariable=self.text, width=self.entry_width)
self.frame = Frame(self)
self.listbox = Listbox(self.frame, height=self.listbox_height, width=self.entry_width)
self.dropdown = Listbox(self.frame, height=self.listbox_height, width=self.entry_width, background="#cfeff9",
takefocus=0)
self.entry.pack()
self.frame.pack()
self.listbox.grid(column=0, row=0, sticky=N)
self.dropdown.grid(column=0, row=0, sticky=N)
self.dropdown.grid_forget()
root = Frame(Tk())
autocomplete = Autocomplete(root, width=74, height=10, entries=entries)
root.pack()
autocomplete.pack()
mainloop()
我收到以下代码的相关警告:
from tkinter import *
from tkinter import ttk
class Autocomplete(Frame, object):
def __init__(self, *args, **kwargs):
super(Autocomplete, self).__init__(*args, **kwargs)
self.list = []
def build(self, width, height, entries):
# I get the warning for the following 8 lines:
self._entries = entries
self.listbox_height = height
self.entry_width = width
self.text = StringVar()
self.entry = ttk.Entry(self, textvariable=self.text, width=self.entry_width)
self.frame = Frame(self)
self.listbox = Listbox(self.frame, height=self.listbox_height, width=self.entry_width)
self.dropdown = Listbox(self.frame, height=self.listbox_height, width=self.entry_width, background="#cfeff9",
takefocus=0)
self.entry.pack()
self.frame.pack()
self.listbox.grid(column=0, row=0, sticky=N)
self.dropdown.grid(column=0, row=0, sticky=N)
self.dropdown.grid_forget()
return self
root = Frame(Tk())
autocomplete = Autocomplete(root).build(74, 10, entries)
root.pack()
autocomplete.pack()
mainloop()
我应该如何解决这个问题?我试图将所有内容移动到 init,但随后我在创建 Autocompelete 对象的行中传递参数时遇到了一些错误。因此,请向我提供我必须进行的所有更改。不仅仅是你必须移动它们。 我可以通过添加 8 个定义行来修复警告,将 None 分配给所有变量,但我认为这是一个愚蠢的解决方案。那么正确的做法是什么?
请记住,并非所有警告都需要修复,这一点始终很重要。警告只是警告。他们应该指出代码的特定部分,因为它是 "common" 问题的根源。但有时你 need/want 会那样做。
I could fix the warning by adding 8 definition lines assigning None to all the variables
这只是 "silencing" 警告,在我看来,这与忽略警告一样好。
So what is the right thing to do?
正确的方法是只使用 __init__
。我做了一个快速测试,我没有任何问题。
然而,这只是一个如何做到这一点的例子。我还没有检查 Frame
想要什么作为 __init__
的参数,所以它可能会导致冲突:
from tkinter import *
from tkinter import ttk
class Autocomplete(Frame, object):
def __init__(self, *args, **kwargs):
width, height, entries = kwargs.pop('width'), kwargs.pop('height'), kwargs.pop('entries')
super(Autocomplete, self).__init__(*args, **kwargs)
self.list = []
self._entries = entries
self.listbox_height = height
self.entry_width = width
self.text = StringVar()
self.entry = ttk.Entry(self, textvariable=self.text, width=self.entry_width)
self.frame = Frame(self)
self.listbox = Listbox(self.frame, height=self.listbox_height, width=self.entry_width)
self.dropdown = Listbox(self.frame, height=self.listbox_height, width=self.entry_width, background="#cfeff9",
takefocus=0)
self.entry.pack()
self.frame.pack()
self.listbox.grid(column=0, row=0, sticky=N)
self.dropdown.grid(column=0, row=0, sticky=N)
self.dropdown.grid_forget()
root = Frame(Tk())
autocomplete = Autocomplete(root, width=74, height=10, entries=entries)
root.pack()
autocomplete.pack()
mainloop()