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

时间:2015-06-24 14:34:26

标签: python oop

作为一个简单的例子,我们假设我们要创建许多Earthquake个实例,其名称,起源时间和震源坐标属性来自编码为字符串("Nepal 25-4-2015T11:56:26 28.14 84.71 15.0")的其他来源。

class Earthquake(object):
    def __init__(self, strline):
        ....

所以,我们必须做的是:

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

  2. 通过将这些值传递给初始化调用Earthquake来实例化__init__

  3. 想象一下,第一部分是通过一个简单的函数完成的:

    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:])
    

    现在我想使用类class Earthquake以每个对象具有属性EarthquakeEarthquake.nameEarthquake.otime,{的方式创建Earthquake.lat个对象{1}}和Earthquake.lon

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

2 个答案:

答案 0 :(得分:6)

我会完全反过来这样做。解析该字符串显然是$(function () { if (!app.noticeModal) { this.noticeModal = new $.modal({ closeOnSideClick: true, staticPos: true }); } this.noticeModal.setContent($('#contract-suspension-modal').html()); this.noticeModal.show(); }); 对象应该做的部分,因此使用类方法将其作为备用构造函数提供:

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)

或者,如果您希望该功能保持独立,请向其添加quake = Earthquake.from_string("Nepal 25-4-2015T11:56:26 28.14 84.71 15.0")

return

并让类方法调用它:

def myfunc(strline):
    ...
    return name, otime, lat, lon, depth

(如果此语法不熟悉,请参阅What does ** (double star) and * (star) do for parameters?

答案 1 :(得分:3)

你可以做的一件事就是以字符串作为参数调用Earthquake,并在__init__调用解析函数。

import datetime as dt

class Earthquake(object):
    def __init__(self, strline):
        self.parse_data(strline)

    def parse_data(self, strline):
        items = line.split()
        self.name = items[0]
        self.otime = dt.datetime.strptime(items[1], "%d-%m-%YT%H:%M:%S")
        self.lat, self.lon, self.depth = map(float, items[2:])