gpt4 book ai didi

python - Python 中的访问器是否合理?

转载 作者:太空狗 更新时间:2023-10-29 20:14:56 25 4
gpt4 key购买 nike

我意识到在大多数情况下,在 Python 中更喜欢直接访问属性,因为没有像 Java 等中那样真正的封装概念。但是,我想知道是否没有任何异常(exception),尤其是具有不同实现的抽象类。

假设我正在编写一堆抽象类(因为我是)并且它们代表与版本控制系统有关的事情,例如存储库和修订(因为它们确实如此)。像 SvnRevision 和 HgRevision 以及 GitRevision 这样的东西在语义上非常紧密地联系在一起,我希望它们能够做同样的事情(这样我就可以在别处拥有作用于任何类型的 Repository 对象的代码,并且不知道子类),这就是为什么我希望它们从抽象类继承。但是,它们的实现方式差异很大。

到目前为止,已经实现的子类共享了很多属性名,并且在类本身之外的很多代码中,使用了直接属性访问。例如,Revision 的每个子类都有作者属性和日期属性等。但是,抽象类中的任何地方都没有描述这些属性。在我看来,这是一个非常脆弱的设计。

如果有人想编写 Revision 类的另一个实现,我觉得他们应该能够通过查看抽象类来实现。然而,满足所有抽象方法的类的实现几乎肯定会失败,因为作者不知道他们需要名为“author”和“date”等的属性,所以尝试访问 Revision 的代码。作者将抛出异常。可能不难找到问题的根源,但仍然很烦人,感觉就像一个不优雅的设计。

我的解决方案是为抽象类(get_id、get_author 等)编写访问器方法。我认为这实际上是一个非常干净的解决方案,因为它消除了对属性命名和存储方式的任意限制,并且只是明确了对象需要能够访问哪些数据。任何实现抽象类的所有方法的类都可以工作……感觉不错。

无论如何,与我一起工作的团队讨厌这个解决方案(似乎是因为访问器是非 pythonic 的,我无法反驳这一点)。那么……还有什么选择呢?文档?还是我想象的问题不是问题?

注意:我考虑过属性,但我不认为它们是更清洁的解决方案。

最佳答案

Note: I've considered properties, but I don't think they're a cleaner solution.

But they are.通过使用属性,您将拥有所需的类签名,同时能够将该属性用作属性本身。

def _get_id(self):
return self._id

def _set_id(self, newid):
self._id = newid

可能与您现在拥有的类似。为了安抚您的团队,您只需添加以下内容:

id = property(_get_id, _set_id)

您还可以使用 property 作为装饰器:

@property
def id(self):
return self._id

@id.setter
def id(self, newid):
self._id = newid

要使其只读,只需省略 set_id/id.setter 位即可。

关于python - Python 中的访问器是否合理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3292631/

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