gpt4 book ai didi

python - 需要建议如何在 Python 中表示特定的数据结构

转载 作者:太空宇宙 更新时间:2023-11-04 07:26:13 26 4
gpt4 key购买 nike

我不确定如何在 Python 中表示特定的数据结构。它由组和用户组成,其中每个用户必须恰好是一个组的成员,并且组应该依次包含在一个容器中,组和用户只能在这个容器中使用。此外,我需要随机访问组和用户。示例数据的 JSON 表示形式如下所示:

{
"groupa": {
"name": "groupa",
"description": "bla",
"members": {
"usera": {
"name": "usera",
"age": 38
},
"userb": {
"name": "userb",
"age": 20
}
}
},
"groupb": {
"name": "groupb",
"description": "bla bla",
"members": {
"userc": {
"name": "userc",
"age": 56
}
}
}
}

简单地使用嵌套字典似乎不合适,因为用户和组都有明确定义的属性。因为组和用户只在容器内使用,所以我想出了一个嵌套类:

class AccountContainer:
class Group:
def __init__(self, container, group):
self.name = group
self.members = {}
self.container = container
self.container.groups[self.name] = self # add myself to container


class User:
def __init__(self, group, user, age=None):
self.name = user
self.age = age
self.group = group
self.group.members[self.name] = self # add myself to group

def __init__(self):
self.groups = {}

def add_user(self, group, username, age=None):
# possibly check if group exists
self.groups[group].members[username] = AccountContainer.User(self.groups[group], username, age=age)

def add_group(self, group):
self.groups[group] = AccountContainer.Group(self, group)


# creating
c = AccountContainer()
c.add_group("groupa")
c.add_user("groupa", "usera")

# access
c.groups["groupa"].members["usera"].age = 38

# deleting
del(c.groups["groupa"].members["usera"])
  • 您将如何表示这样的数据结构?
  • 这是一种合理的方法吗?

对我来说,使用一种方法来创建组或用户,同时引用字典似乎有点不自然。

最佳答案

我认为,在多范式语言(如 C++ 或 Python,虽然支持类并不限制你使用它们,但更简单的结构可以使用)中大量的无行为类是一种“设计味道” "-- 相当于 "code smell" 的设计, 尽管是温和的。

如果我正在对此进行代码审查,我会指出这一点,尽管这并不比让我坚持重构更糟糕。嵌套类(没有特定的代码行为原因需要嵌套)使这一点更加复杂:它们没有提供特定的好处,另一方面可以“妨碍”,例如,在 Python 中,通过干扰序列化(pickling)。

除了良好的旧指令和成熟的类之外,Python 2.6 还提供了 namedtuple 的便捷替代方案。 s 代表具有一组预定义属性的“结构”;它们似乎特别适合这种用例。

add...__init__ 方法中组合的方便的“将此组/用户添加到那个容器/组”功能可以重构为独立函数(访问器也可以,尽管这不是什么大问题——将内部结构隐藏到独立访问器中会让您更接近遵守 Law of Demeter )。

关于python - 需要建议如何在 Python 中表示特定的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1393849/

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