一些 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
此方法仅适用于转换为特定类型,例如 float
和 int
,因为转换实际上发生在传递的对象中。我想要的是相反的情况,转换发生在传递字符串的对象中。我认为 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/