【问题标题】:Store Instance of Class in String将类的实例存储在字符串中
【发布时间】:2021-07-28 11:18:10
【问题描述】:

如何将类的实例存储在字符串中?我尝试了eval,但没有成功并抛出了SyntaxError。我希望这适用于用户定义的类和内置类(intstrfloat)。

代码:

class TestClass:
    def __init__(self, number):
        self.number = number

i = TestClass(14)
str_i = str(i)
print(eval(str_i)) # SyntaxError
print(eval("jkiji")) # Not Defined
print(eval("14")) # Works!
print(eval("14.11")) # Works!

【问题讨论】:

  • 存储实例的目的是什么?
  • “我如何将一个类的实例存储在一个字符串中” 使用一个实际的对象序列化格式。这适用于大多数内置类型的事实并不意味着您应该以这种方式实际使用它。使用pickle

标签: python string class


【解决方案1】:

约定是在__repr__ 方法中返回一个字符串,您可以使用该字符串实例化相同的对象,如果完全合理的话。

class TestClass:
    def __init__(self, number):
        self.number = number
    def __repr__(self):
        return f'{self.__class__.__name__}({self.number})'

演示:

>>> t = TestClass(14)
>>> t
TestClass(14)
>>> str(t)
'TestClass(14)'
>>> eval(str(t))
TestClass(14)

(当然,you should not actually use eval 以这种方式重新实例化对象。)

【讨论】:

  • 是的,这是应该的方式,但用户可以传递他们自己的类(使用 setattr 和 getattr 创建一个非常简单的数据结构)
  • @KetZoomer 这绝对不是它应该做的方式
  • @juanpa.arrivillaga 是的,我知道 :)
【解决方案2】:

您还可以使用pickle 内置模块将对象转换为字节字符串并返回:

import pickle

class TestClass:
    def __init__(self, number):
        self.number = number

t1 = TestClass(14)
s1 = pickle.dumps(t1)
t2 = pickle.loads(s1)

然后

print(t2.number)

将打印

14

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多