尝试理解Python类和模块

  • 本文关键字:模块 Python python-3.x
  • 更新时间 :
  • 英文 :


我正在用Python编写一个简单的IMAP客户端。一旦我得到了一个初始脚本工作(我可以下载并向用户显示一个邮箱列表),我决定是时候让代码更有条理了。

我把IMAP相关的函数分解成一个模块名IMAP .py,把用户交互+ CUI相关的函数分解成一个模块名mail.py。我将imap.py导入到mail.py中,但是当我尝试调用imap_functions类时,我得到了一个"未定义的名称"。错误。我很困惑,因为我在imap.py的开头定义了类imap_functions,正如我所说,它被导入到主脚本中。

下面是两个脚本的代码:
# mail.py
import py_cui
import imap
#from itertools import chain

host = "imap.gmail.com"
username = "user@gmail.com"
password = "someappapassword"
imap_functions = imap_functions(host, username, password)
class Mail:
def __init__(self, master):
self.master = master
# Creating widgets for mailbox list on left and message list onright

# Make Mailbox widget and get a list of folders for account
Mailboxes = self.master.add_scroll_menu('Mailboxes', 0, 0, row_span=6, column_span=1)
Mailboxes.add_item_list(imap_functions.get_folders())
# Make a Messages widget and get a list of messages based on the folder selected. 
Messages = self.master.add_scroll_menu('Messages', 0, 1, row_span=6, column_span=4)
# First select the folder
# message_list = client....whatever method lists messages
# Messages.add_item_list(message_list)



# Create the CUI with 7 rows 6 columns (may change later), pass it to the wrapper object, and start it
root = py_cui.PyCUI(7, 6)
root.set_title('Mail')
s = Mail(root)
imap_functions.login()
root.start()

### imap.py
import ssl
import imapclient
import email


class imap_functions:
def __init__(self, host, username, password):
self.host = host
self.username = username
self.password = password
self.client = IMAPClient(host)

def login(self, username, password):
"Handling various auth protocols"
#client.starttls() --- gmail does not support starttls
client.login(username, password)
return;
def get_folders(self):
"Grabbing the list of folders for the account"
get_folders = client.list_folders()
folder_list = []
for folders in get_folders:
folder_list.append(folders[2])
return folder_list;

#client.select_folder("INBOX")

您可以将导入更改为

from imap import imap_functions
# ...
imap_functions = imap_functions(host, username, password)

或者正如@mkrieger1所指出的,您可以通过调用

从模块访问类
import imap
# ...
imap_functions = imap.imap_functions(host, username, password)

我还建议将类名更改为ImapFunctions,因为snake_case通常用于变量和函数。理想情况下,您可以将名称更改为更好的名称,如ImapClient,但我想这是一个选择的问题,谁会看到你的代码除了你。

最新更新