python - 从字符串创建 Python 对象

标签 python parsing constructor

一些 Python 类(例如 float)可以解析字符串来创建对象:

number_string = "4.5"
assert float(number_string) == 4.5

这在技术上是什么?使用字符串调用构造函数?但是,如果构造函数还采用其他参数来进行通常的对象构造(而不是来自字符串)怎么办?

如何实现一个可以解析字符串来创建实例的类?

添加:

看起来float(str)正在调用传递字符串的__float__特殊方法 - 字符串知道它的float值。

每个实现__float__的对象都可以传递给float(obj):

>>> class MyClass:
...     def __float__(self):
...             return 0.01
...
>>> m = MyClass()
>>> float(m)
0.01

此方法仅适用于转换为特定类型,例如 floatint,因为转换实际上发生在传递的对象中。我想要的是相反的情况,转换发生在传递字符串的对象中。我认为 Paul McGuire 建议的静态 parse 方法可能是一个很好的解决方法。

最佳答案

这是一个带有字符串的构造函数调用。如果您的构造函数需要的不仅仅是字符串值,那么您可以定义一个类方法工厂方法,该方法接受一个字符串,从中提取附加数据(无论您如何对其进行编码),然后使用所有必要的参数调用构造函数。 @tiagoboldt 引用了此类定义:

class Student(object):
    def __init__ (self, name, age, gender):
        self.name   = name
        self.age    = age
        self.gender = gender

我会添加此方法来接受“姓名/年龄/性别”形式的字符串:

    @classmethod
    def parse(cls, s):
        # some input validation here would be a good idea
        name,age,gender = s.split('/')
        age = int(age)
        return cls(name, age, gender)

s1 = Student("Bob", 10, "M")
s2 = Student.parse("Bill/12/M")

关于python - 从字符串创建 Python 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5249813/

相关文章:

python - Django:管理员中的[电子邮件保护]

java - 安卓/java : cannot parse existing XML file?(苹果机)

C++ 将参数类型解释为构造函数

c# - 为什么派生类需要使用基类构造函数

c++ - 如何编写正确的 std::initializer_list 构造函数

python - 使用 NLTK 库对一堆 txt 文件使用 TF-IDF 进行标记化和词形还原

python - 从 python 混合器接收空值

python - 在绘图上标记 python 数据点

Java:求解符号代数方程

android - JSOUP 解析谷歌图片