【问题标题】:Converting a String to a Class (and vice versa) in Python在 Python 中将字符串转换为类(反之亦然)
【发布时间】:2015-11-19 23:10:17
【问题描述】:

对于我正在进行的项目,我需要将一个字符串(具有 ID 号(即 ID_00000001...ID_00002032 或类似的东西))转换为一个类。 我的意思是,已经存储了一个具有如下值的类:

class ID_00000001:
  name = 'Robert Johnson'
  age = 193
  facebook_url = 'facebook.com/Robert_johnson'
  etc.

我想这样做,以便我可以将此个人资料与其他人进行比较。我正在考虑这样做的方式是比较(psudo)之类的值:

current_profile_str = 'ID_00000001'
for i in range(len(all_IDs)):
  matches = []
  num = *converts number into 8 digit str*
  cycle_profile_str = 'ID_' + num
  *convert current_profile and cycle_profile to class*
  if (current_profile.age == cycle_profile.age):
      matches.append(cycle_profile_str)

所以我想我在这种情况下的问题是,我如何能够将字符串转换为类?

【问题讨论】:

  • 你为什么不用字典?
  • 我感觉你在使用类有点奇怪....
  • 看起来您将类与实例混淆了。在继续之前最好read about it
  • 以这种方式使用类是可疑的......你能进一步解释一下你的用例吗?

标签: python string class backend


【解决方案1】:

您错误地使用了类。你有一个班级,一个 facebook 用户。 这可能如下所示:

class FacebookUser():
    def __init__(self, id, name, age, url):
        self.id = id
        self.name = name
        self.age = age
        self.url = url

然后您可以为每个用户创建实例。

user1 = FacebookUser(1, 'John Doe', 27, 'facebook.com/john_doe')
user2 = FacebookUser(3, 'Jane Doe', 92, 'facebook.com/jane_doe')

print(user1.age == user2.age)

要将类表示为字符串,可以在类中添加__repr__魔术函数:

class FacebookUser():
    def __init__(self, id, name, age, url):
        self.id = id
        self.name = name
        self.age = age
        self.url = url

    def __repr__(self):
        return 'FacebookUser(id: {:08d}, name: {}, age: {})'.format(
             self.id,
             self.name,
             self.age,
        )

这将导致

>>> print(user1)
FacebookUser(id: 00000001, name: John Doe, age: 27)

反之,您可以使用实现替代构造函数 一个类方法。这些方法属于一个类,而不是实例。 这些函数中的第一个参数是类cls,而不是实例self:

class FacebookUser():
    def __init__(self, id, name, age, url):
        self.id = id
        self.name = name
        self.age = age
        self.url = url

    def __repr__(self):
        return 'FacebookUser(id: {:08d}, name: {}, age: {})'.format(
            self.id,
            self.name,
            self.age,
        )

    @classmethod
    def from_string(cls, string):
        '''
        Create a new instance from a string with format
        "id,name,age,url"
        '''
        _id, name, age, url = string.split(',')
        return cls(int(_id), name, int(age), url)

user1 = FacebookUser.from_string('1,John Doe,27,facebook.com/john_doe')

【讨论】:

    【解决方案2】:

    MaxNoe 的答案可能正是您想要的,但无论如何...

    如果您真的,真的想以某种方式从字符串序列构建一个类(例如,要从字符串本身提取名称的变量,那么您可能需要查看元类。

    http://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 2011-05-27
      • 2014-07-22
      • 2019-01-30
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多