前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过字符串创建对象实例

通过字符串创建对象实例

原创
作者头像
用户11021319
发布2024-04-03 09:29:23
610
发布2024-04-03 09:29:23

1、问题背景

在大多编程语言中,我们可以创建变量,然后在运行时指定其值。但是在 Python 中,变量名通常是固定的,在程序运行前就需要定义。如果想在运行时动态创建变量名,该如何实现呢?这篇文章中将介绍两种方法来解决这个问题。

2、解决方案

方法一:使用 setattr() 函数

setattr() 函数可以动态地给一个对象设置属性。下面是一个示例代码:

代码语言:python
复制
class Zoo(object):
    def __init__(self, species, legs, stomachs):
        self.species = species
        self.legs = legs
        self.stomachs = stomachs

def create_species():
    name = raw_input('Enter species name: ')
    legs = input('How many legs? ')
    stomachs = input('How many stomachs? ')
    species = Zoo(name, legs, stomachs)
    setattr(sys.modules[Zoo.__module__], name, species)

if __name__ == '__main__':
    for i in range(5):
        create_species()

在上面的代码中,我们首先定义了一个名为 Zoo 的类,这个类包含了一个构造函数 init(),用于初始化动物的属性。然后我们定义了一个名为 create_species() 的函数,这个函数用于动态创建动物实例。在 create_species() 函数中,我们首先通过 raw_input() 函数获取用户输入的动物名称。然后我们通过 input() 函数获取用户输入的动物腿数和胃数。接下来,我们创建一个 Zoo 实例,并使用 setattr() 函数将其添加到 sys.modules[Zoo.module] 字典中。最后,我们通过 sys.modules[Zoo.module] 字典获取动物实例,并将其打印出来。

方法二:使用 builtin 模块

builtin 模块包含了一些 Python 内置的函数和变量。我们可以使用 builtin 模块来动态创建变量名。下面是一个示例代码:

代码语言:javascript
复制
class Zoo(object):
    def __init__(self, species, legs, stomachs):
        self.species = species
        self.legs = legs
        self.stomachs = stomachs
        import __builtin__
        setattr(__builtin__, species, self)

def create_species():
    name = raw_input('Enter species name: ')
    legs = input('How many legs? ')
    stomachs = input('How many stomachs? ')
    species = Zoo(name, legs, stomachs)

if __name__ == '__main__':
    for i in range(5):
        create_species()

在上面的代码中,我们首先定义了一个名为 Zoo 的类,这个类包含了一个构造函数 init(),用于初始化动物的属性。然后我们定义了一个名为 create_species() 的函数,这个函数用于动态创建动物实例。在 create_species() 函数中,我们首先通过 raw_input() 函数获取用户输入的动物名称。然后我们通过 input() 函数获取用户输入的动物腿数和胃数。接下来,我们创建一个 Zoo 实例,并使用 setattr() 函数将其添加到 builtin 模块中。最后,我们通过 builtin 模块获取动物实例,并将其打印出来。

这两种方法都可以动态创建变量名,但是第一种方法更加常用,也更加安全。第二种方法虽然可以实现同样的效果,但是它会将变量名添加到 builtin 模块中,这可能会导致命名冲突。所以,在实际项目中,我们通常会使用第一种方法。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、问题背景
  • 2、解决方案
    • 方法一:使用 setattr() 函数
      • 方法二:使用 builtin 模块
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档