2015-06-10 22 views
-3

我试图通过应用OOP和DRY方法保持我的代码清洁;但是,我发现自己坚持以下问题。在Python中使用OOP和DRY方法需要说明

1)由于checkremote备份方法依赖于sshlogin方法,有另一种方式来写它,这样我的对象是完全初始化? 2)如果没有更好的方法,我在哪里编写PhoneBook类的程序以下列方式执行(1 - checklocal,2 - sshlogin,3 - checkremote,4 - 备份)?主要?

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 checklocal (self): 
     # Check local phonebook for existing names 
     pass 


    def sshlogin (self): 
     # SSH into remote server 


    def checkremote (self): 
     # Check remote phonebook for existing names 
     pass 


    def backup (self): 
     # Backup remote phonebook 
+3

为什么世界上都是'Add'和'Delete'类?如何添加或删除一种电话簿? – kindall

+0

同意@kindall。它们可能应该是电话簿类的方法,或者是独立的通用函数。 –

+0

谢谢。我会做出改变。 – dreamzboy

回答

1

在这种情况下,你可能想使用的上下文管理和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__方法,它更像是一个电话簿条目。您可能需要考虑将您的电话簿(作为上下文管理器,如上所述)分开作为某种容器来容纳您的条目(包括adddelete方法),并将您的电话簿重点设置为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) 
+1

感谢瑞克花时间布置细节。我会试一试。 – dreamzboy

+0

@dreamzboy没问题,但最好的答谢方式是通过提供答案并接受答案(绿色选中标记)。 –

+0

@dreamzboy更多关于with语句可以在[here]找到(http://effbot.org/zone/python-with-statement.htm) –