作为一个简单的例子,让我们假设我们想要创建许多Earthquake实例,其名称,原始时间和震源坐标属性来自编码为strings("Nepal 25-4-2015T11:56:26 28.14 84.71 15.0")的其他源.
class Earthquake(object):
def __init__(self, strline):
....
Run Code Online (Sandbox Code Playgroud)
所以,我们必须做的是:
解析字符串以接收名称,日期,时间,纬度,经度和深度.
Earthquake通过将这些值传递给初始化调用来实例化__init__.
想象一下,第一部分是通过一个简单的函数完成的:
import datetime as dt
def myfunc(strline):
items = line.split()
name = items[0]
otime = dt.datetime.strptime(items[1], "%d-%m-%YT%H:%M:%S")
lat, lon, depth = map(float, items[2:])
Run Code Online (Sandbox Code Playgroud)
现在我想使用这个类class Earthquake来创建Earthquake,每个对象具有属性的对象的方式Earthquake.name,Earthquake.otime,Earthquake.lat,Earthquake.lon和Earthquake.depth.
如何调用类myfunc中的__init__方法来初始化具有上述属性的对象?
我会完全反过来这样做.解析该字符串显然是Earthquake对象应该做的事情的一部分,因此使用类方法将其作为备用构造函数提供:
class Earthquake(object):
def __init__(self, name, otime, lat, lon, depth):
self.name = name
self.otime = otime
self.lat = lat
self.lon = lon
self.depth = depth
@classmethod
def from_string(cls, strline):
items = line.split()
name = items[0]
otime = dt.datetime.strptime(items[1], "%d-%m-%YT%H:%M:%S")
lat, lon, depth = map(float, items[2:])
return cls(name, otime, lat, lon, depth)
Run Code Online (Sandbox Code Playgroud)
现在你打电话给:
quake = Earthquake.from_string("Nepal 25-4-2015T11:56:26 28.14 84.71 15.0")
Run Code Online (Sandbox Code Playgroud)
或者,如果您希望该功能保持独立,请添加一个return:
def myfunc(strline):
...
return name, otime, lat, lon, depth
Run Code Online (Sandbox Code Playgroud)
并使类方法调用它:
class Earthquake(object):
...
@classmethod
def from_string(cls, strline):
return cls(*myfunc(strline))
Run Code Online (Sandbox Code Playgroud)
(如果不熟悉这种语法,请参阅**(双星)和*(星)对参数做什么?)