在这种情况下,你可能想使用的上下文管理和with
关键字。
由于使用Phonebook
对象需要事先设置阶段,所以您需要确保每次使用它时都能正确处理。所以,你会能写出这样的代码:
with Phonebook(name, phone_number, birthdate, location) as phbk:
#do stuff with the phonebook
phbk.add(name, phone_number, birthdate, location)
您所有的安装阶段步骤 - 检查本地副本,连接(和断开)SSH会话,检查远程复制,备份等 - 会发生“幕后“,作为上下文管理器的设置/拆卸的一部分(换句话说,with
声明处理所有这些)。这类似于你应该如何使用open()
:
with open('myfile') as file:
lines = file.readlines()
干净地打开和关闭文件,会出现“幕后”,自动的。这可能是您想要在电话簿中发生的事情。
为了使上下文管理器正常工作,请使用python __enter__
和__exit__
魔术方法。可能是这个样子:
class PhoneBook:
def __init__ (self, name, phone_number, birthdate, location):
self.name = name
self.phone_number = phone_number
self.birthdate = birthdate
self.location = location
self.ssh = None
def sshlogin(self):
# SSH into remote server
def sshlogout(self):
# SSH out of remote server
def checklocal(self):
# Check local phonebook for existing names
pass
def checkremote (self):
# Check remote phonebook for existing names
pass
def backup (self):
# Backup remote phonebook
def __enter__(self):
self.checklocal()
self.sshlogin()
self.checkremote()
self.backup()
return self
def __exit__(self, cls, value, traceback):
self.sshlogout()
return False
至于你Add
(和Delete
)类,它真的不应该是一个阶级。它也许应该要么是:
的Phonebook
类的方法,像这样:
class Phonebook:
def __init__(self):
self.ssh = None
def add(self, name, phone_number, birthdate, location):
self.name = name
self.phone_number = phone_number
self.birthdate = birthdate
self.location = location
或
一个通用的功能,例如:
def Add(phbk, name, phone_number, birthdate, location):
# add to remote phonebook
A furth呃点:你的Phonebook
类没有被很好地命名。基于__init__
方法,它更像是一个电话簿条目。您可能需要考虑将您的电话簿(作为上下文管理器,如上所述)分开作为某种容器来容纳您的条目(包括add
和delete
方法),并将您的电话簿重点设置为Phonebook
(更名为Entry
或
def add(self, entry):
try:
self.entries.append(entry)
except AttributeError:
self.entries = [entry]
还有一两件事:我注意到您在使用标签上更加可添加到您的新Phonebook
对象电话簿Entry
对象,在这种情况下,add方法可能更喜欢这个东西)字符来定义你的类,函数,而不是。这是against the recommended practice - 改用4个空格。
进一步的建议:什么东西是我建议的Entry
类那么简单,你可能只是想使用collections.namedtuple
,像这样:
from collections import namedtuple as nt
Entry = nt('Entry', 'name phone_number birthdate location')
现在你可以做这样的东西:
e = Entry('rick', '8675309', '1/1/2001', '125 Sesame St`)
print(e.name)
为什么世界上都是'Add'和'Delete'类?如何添加或删除一种电话簿? – kindall
同意@kindall。它们可能应该是电话簿类的方法,或者是独立的通用函数。 –
谢谢。我会做出改变。 – dreamzboy