2015-06-24 43 views
3

作爲一個簡單的例子,我們假設我們要創建大量的Earthquake實例,其名稱,原點時間和震源座標屬性來自其他來源(字符串編碼爲"Nepal 25-4-2015T11:56:26 28.14 84.71 15.0")。如何通過調用__init__方法中的方法來引入python中的對象的屬性?

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

所以,我們必須做的是:

  1. 解析字符串接受的名稱,日期,時間,經緯度和深度。通過將這些值傳遞給初始化調用__init__來實例化Earthquake

想象中的第一部分通過一個簡單的函數來完成:

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的方式來創建Earthquake對象,每個對象都有屬性Earthquake.nameEarthquake.otimeEarthquake.latEarthquake.lonEarthquake.depth

如何在類中使用__init__方法調用myfunc方法初始化具有上述屬性的對象?

回答

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) 

現在你罵例如:

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 

,使類方法調用它:

class Earthquake(object): 

    ... 

    @classmethod 
    def from_string(cls, strline): 
     return cls(*myfunc(strline)) 

(如果這句法是陌生的,看What does ** (double star) and * (star) do for parameters?

+0

我從這個答案中學到了OOP的一個新方面。 – bcdan

3

一個你可以做的事情就是調用地震與字符串作爲參數並在__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:]) 
+0

有些linters會抱怨你正在設置'__init__'之外的實例屬性。這也使測試類稍微困難一些,因爲如果不將輸入數據格式化爲所需的字符串,就無法初始化它。 – jonrsharpe

相關問題