需要说明在Python中使用OOP和DRY方法吗

2024-04-26 03:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过应用OOP和DRY方法来保持代码的整洁;然而,我发现自己被以下问题困住了。你知道吗

1)由于checkremotebackup方法依赖于sshlogin方法,是否有其他方法来写入它,以便完全初始化我的对象?你知道吗

2)如果没有更好的方法,我应该在哪里为PhoneBook类编写过程,以便按以下方式执行(1-checklocal,2-sshlogin,3-checkremote,4-backup)?主要是什么?你知道吗

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

Tags: 方法nameselfnumberremotedefphonelocation
1条回答
网友
1楼 · 发布于 2024-04-26 03:22:20

在本例中,您可能希望使用上下文管理器和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
    

还有一点:您的Phonebook类的命名不太好。基于__init__方法,它更像是一个电话簿条目。您可能需要考虑将您的电话簿(作为上下文管理器,如上所述)分别实现为某种容器来保存条目(包括adddelete方法),把你拥有的Phonebook类(改名为Entry或别的什么)更多地放在一个电话簿Entry对象上,这个对象可以添加到你的新Phonebook对象中,在这种情况下,add方法可能更像这样:

    def add(self, entry):
        try:
            self.entries.append(entry)
        except AttributeError:
            self.entries = [entry] 

还有一件事:我注意到您正在使用制表符来定义类、函数以及其他不需要的东西。这是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)

相关问题 更多 >