iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python语法糖生成同一类的相同实例?
  • 129
分享到

Python语法糖生成同一类的相同实例?

2024-02-09 05:02:17 129人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

问题内容 假设我有这个简单的课程: class person: def __init__(self, name, id): self.name = name

问题内容

假设我有这个简单的课程:

class person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

以及以下实例:

tom = person('tom', 12)
dick = person('dick', 14)
harry = person('harry', 16)

但我希望我的模块的用户能够创建这些人的多个实例,而不必调用 person 构造函数,因为 nameid 应仅在一个位置声明。

选项:

  1. 使用 copydeepcopy。这将提供我需要的功能,但每次我想使用 tom 时,我都必须记住创建他的副本。这太笨重了。

  2. 创建 tom

class Tom(Person):
    def __init__(self):
        super().__init__('Tom', 12)

这更干净一些,因为每次我想要一个新的 tom 时,我都可以执行 tom() ,但这需要编写大量代码,而且不是很干燥。

python 中是否有其他语法糖可以使这种事情变得更容易?


正确答案


我认为这是工厂/注册表类型模式的一个很好的用例。这个想法是为类和单个注册表字典实现一个替代的方便构造函数,该字典存储与给定标签相对应的配置。看一下下面的例子:

person_reGIStry = {
    "tom": {"name": "tom", "id": 12},
    "jerry": {"name": "jerry", "id": 13},
    "dick": {"name": "dick", "id": 14},
}


class person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

    @claSSMethod
    def from_tag(cls, tag):
        """create a person from a tag"""
        if tag not in person_registry:
            raise valueerror(f"not a valid tag {tag}, choose from {list(person_registry)}")
        
        return cls(**person_registry[tag])
    
print(person.from_tag("tom"))

现在您可以导入 person 类并从较短的标签创建实例,而实际数据存储在一个位置,即 person_registry 字典中。如果你想减少冗长,你也可以 使用位置参数,但关键字参数通常更可取,因为更明确(Python 的 zen)。

这种模式的优点在于它实际上是可扩展的。因此用户可以扩展 person_registry 字典,例如:

from persons import Person, PERSON_REGISTRY

PERSON_REGISTRY["liz"] = {"name": "elizabeth", "id": 23}

liz = Person.from_tag("liz")

我希望这会有所帮助。

以上就是Python语法糖生成同一类的相同实例?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Python语法糖生成同一类的相同实例?

本文链接: https://www.lsjlt.com/news/562190.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作