gpt4 book ai didi

Python API设计模式问题

转载 作者:太空狗 更新时间:2023-10-29 20:31:42 27 4
gpt4 key购买 nike

我经常发现我的类实例是其他类实例的后代,以树状方式排列。例如,假设我正在用 Python 制作 CMS 平台。我可能有一个 Realm,在它下面有一个 Blog,在那个下面有一个 Post。每个构造函数都将它的父对象作为第一个参数,因此它知道它属于什么。它可能看起来像这样:

class Realm(object):
def __init__(self, username, password)

class Blog(object):
def __init__(self, realm, name)

class Post(object);
def __init__(self, blog, title, body)

我通常会向父类添加一个创建方法,因此链接会更自动一些。我的 Realm 类可能如下所示:

class Realm(object):
def __init__(self, username, password):
...
def createBlog(self, name):
return Blog(self, name)

这允许 API 的用户不必导入每个模块,只需导入顶级模块。它可能是这样的:

realm = Realm("admin", "FDS$#%")
blog = realm.createBlog("Kittens!")
post = blog.createPost("Cute kitten", "Some HTML blah blah")

问题是那些创建方法是多余的,我必须在两个地方 pydoc 相同的参数。

我想知道是否有一种模式(可能使用元类)将一个类实例链接到父类实例。我可以通过某种方式调用这样的代码并让博客知道它的父领域是什么:

realm = Realm("admin", "FDS$#%")
blog = realm.Blog("Kittens!")

最佳答案

您可以为具有add() 方法的容器使用通用基类

class Container(object):
def __init__(self, parent=None):
self.children = []
self.parent = parent
def add(self, child)
child.parent = self
self.children.append(child)
return child

并使派生类中的parent参数可选

class Blog(Container):
def __init__(self, name, realm=None):
Container.__init__(realm)
self.name = name

你上面的代码现在应该是

realm = Realm("admin", "FDS$#%")
blog = realm.add(Blog("Kittens!"))
post = blog.add(Post("Cute kitten", "Some HTML blah blah"))

您将不再有任何 create...() 方法,因此无需对任何内容进行两次记录。

如果设置父级不仅仅涉及修改 parent 属性,您可以使用属性或 setter 方法。

编辑:正如您在下面的评论中指出的那样, child 应该在构造函数的末尾与 parent 联系在一起。可以修改上述方法以支持此方法:

class Container(object):
def __init__(self, parent=None):
self.children = []
self.parent = None
def add(self, cls, *args)
child = cls(self, *args)
self.children.append(child)
return child

class Realm(Container):
def __init__(self, username, password):
...

class Blog(Container):
def __init__(self, realm, name):
...

class Post(Container):
def __init__(self, blog, title, body):
...

realm = Realm("admin", "FDS$#%")
blog = realm.add(Blog, "Kittens!")
post = blog.add(Post, "Cute kitten", "Some HTML blah blah")

关于Python API设计模式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5205752/

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