如何通过调用__init__方法中的方法在python中引入对象的属性?

nim*_*shr 3 python oop

作为一个简单的例子,让我们假设我们想要创建许多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)

所以,我们必须做的是:

  1. 解析字符串以接收名称,日期,时间,纬度,经度和深度.

  2. 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.lonEarthquake.depth.

如何调用类myfunc中的__init__方法来初始化具有上述属性的对象?

jon*_*rpe 6

我会完全反过来这样做.解析该字符串显然是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)

(如果不熟悉这种语法,请参阅**(双星)和*(星)对参数做什么?)