gpt4 book ai didi

Python OOP --action() 函数

转载 作者:太空狗 更新时间:2023-10-30 02:13:00 25 4
gpt4 key购买 nike

我是 Python OOP 的新手,正在尝试创建一个 OOP 程序来管理库。此代码来自一本书。

此代码按预期工作,但我需要了解当我选择特定选项时 action() 是如何调用相应函数的,例如:当我选择 1show_notes 函数被调用,即使我们没有调用它。

菜单.py

import sys
from notebook import Notebook, Note

class Menu:
'''Display a menu and respond to choices when run.'''
def __init__(self):
self.notebook = Notebook()
self.choices = {
"1": self.show_notes,
"2": self.search_notes,
"3": self.add_note,
"4": self.modify_note,
"5": self.quit
}

def display_menu(self):
print("""
Notebook Menu

1. Show all Notes
2. Search Notes
3. Add Note
4. Modify Note
5. Quit
""")

def run(self):
'''Display the menu and respond to choices.'''
while True:
self.display_menu()
choice = input("Enter an option: ")
action = self.choices.get(choice)
if action:
action()
else:
print("{0} is not a valid choice".format(choice))

def show_notes(self, notes=None):
if not notes:
notes = self.notebook.notes
for note in notes:
print("{0}: {1}\n{2}".format(
note.id, note.tags, note.memo))

def search_notes(self):
filter = input("Search for: ")
notes = self.notebook.search(filter)
self.show_notes(notes)

def add_note(self):
memo = input("Enter a memo: ")
self.notebook.new_note(memo)
print("Your note has been added.")

def modify_note(self):
id = input("Enter a note id: ")
memo = input("Enter a memo: ")
tags = input("Enter tags: ")
if memo:
self.notebook.modify_memo(id, memo)
if tags:
self.notebook.modify_tags(id, tags)

def quit(self):
print("Thank you for using your notebook today.")
sys.exit(0)

if __name__ == "__main__":
Menu().run()

notebook.py

import datetime

# Store the next available id for all new notes
last_id = 0

class Note:
'''Represent a note in the notebook. Match against a
string in searches and store tags for each note.'''


def __init__(self, memo, tags=''):
'''initialize a note with memo and optional
space-separated tags. Automatically set the note's
creation date and a unique id'''
self.memo = memo
self.tags = tags
self.creation_date = datetime.date.today()
global last_id
last_id += 1
self.id = last_id

def match(self, filter):
'''Determine if this note matches the filter
text. Return True if it matches, False otherwise.

Search is case sensitive and matches both text and
tags.'''
return filter in self.memo or filter in self.tags

class Notebook:

'''Represent a collection of notes that can be tagged,
modified, and searched.'''

def __init__(self):
'''Initialize a notebook with an empty list.'''
self.notes = []

def new_note(self, memo, tags=''):
'''Create a new note and add it to the list.'''
self.notes.append(Note(memo, tags))

def _find_note(self, note_id):
'''Locate the note with the given id.'''
for note in self.notes:
if str(note.id) == str(note_id):
return note
return None

def modify_memo(self, note_id, memo):
'''Find the note with the given id and change its
memo to the given value.'''
note = self._find_note(note_id)
if note:
note.memo = memo
return True
return False

def modify_tags(self, note_id, tags):
'''Find the note with the given id and change its
tags to the given value.'''
note = self._find_note(note_id)
if note:
note.tags = tags
return True
return False

def search(self, filter):
'''Find all notes that match the given filter
string.'''
return [note for note in self.notes if
note.match(filter)]

最佳答案

函数和方法本身就是对象。所以 dict 包含我们随后调用的对象。

所以 self.choices 是一个以“1”、“2”等为键的字典。这些值是方法对象。当您从字典中获取值时,您将获取该对象(称为“可调用对象”)并将其分配给 action。然后使用 action() 调用该对象。

代码的关键部分是这样的:

 self.choices = {
"1": self.show_notes,
"2": self.search_notes,
"3": self.add_note,
"4": self.modify_note,
"5": self.quit
}

self.choices["1"] 计算出 self.show_notes 的值,然后分配给 action,您可以然后调用 action()

(顺便说一句:示例代码中的菜单是硬编码的,但实际上可以自动生成,如果方法有文档字符串的话。"\n".join("%s: %s"% (key , action.__doc__) for key, action in sorted(self.choices.iteritems())) 要正确处理具有 >=10 个项目的菜单,您需要将键设为整数,或展开一行。)

关于Python OOP --action() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11870710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com