2015-04-07 49 views
0

我有一個類名爲名稱是取姓和名與幾個基本功能:如何將名稱列表實現爲預製課程?

class Name: 

def __init__(self, first, last): 
    self._first = first 
    self._last = last 

def first(self): 
    return self._first 

def last(self): 
    return self._last 

def __repre__(self): 
    print("{} {}".format(self._first, self._last)) 

現在我需要創建一個函數,它返回名稱對象的列表清單。 Text_file只是一個文本文件,它的名字是逐行的,名字和姓氏之間有空格。

def name_list(text_file): 

    with open(text_file) as f: 
     lines = f.read().splitlines() 
     for name in lines: 
      print(lines) 

我意識到我只拿到了列表並返回列表中的名稱,而不是名稱對象的列表。

如何使用我的類返回名稱對象列表?

+0

風格尖端:您'first'和'last'方法是冗餘的。 Python在getter和setter上皺眉,而是鼓勵你直接訪問屬性。只需在'__init__'方法中執行'self.first = first'和'self.last = last'並完成它。 – iCodez

回答

0
def name_list(text_file): 
    file = open(text_file, 'r') 
    list = [] 
    for line in file: 
     first, last = line.split() 
     list.append(Name(first, last)) 
    return list 

這將遍歷每一行,在空間上分解它,創建一個名稱對象,將其添加到列表中,然後返回列表。

然後將其打印出來做這樣的事情:

list = name_list(file) 
for name in list: 
    print('Name: {0} {1}'.format(name._first, name._last)) 
+0

啊謝謝你!我現在知道它是如何工作的。 –

+0

至於我的代碼是多餘的,我應該怎麼做呢?在我們的課程中,我們被教導在構造函數中使用「._」,是否應該不使用getter和setters?如果是的話爲什麼不呢 –

+0

雖然那不是我說的那樣,python無法隱藏類成員(至少我知道)。所以人們會用'_'來表示這個變量是私有的,不應該在setter方法之外進行修改。因此,在Python中,從我所收集的內容中,我們直接使用成員,並且不使用setter和getter,因爲沒有像'private'這樣的變量。 因此,您不應該使用Last和First函數,而應該直接使用這些成員,例如在我的示例中。如果你這樣做,我建議刪除下劃線。 – RNikoopour

0

最簡單的就是拆就白空間的每一行。你在上面有一些冗餘的東西:你可以簡單地迭代一個文件來逐行進入 - 不需要調用readlines。

def name_list(text_file): 
    names = [] 
    with open(text_file) as f: 
     for line in f: 
      first_name, last_name in line.split(' ') # tuple unpacking 
      names.append(Name(first_name, last_name)) 
    return names 
0

認爲它可能很酷,展示如何做到這一點在Python中的單線程。我理解這可能是一個有點不太可讀新人,因此,可能不應該接受的答案,但值得了解:

>>> names = [Name(*line.split()) for line in open(text_file)] 

基本上,我們通過在文本文件中的每一行進行迭代,對分裂空格,然後我們使用* -operator將值解包爲類的位置參數。

0

還有一個可能的解決方案:

name_objects = list() 
with open(text_file) as f: 
     for each_line in f: 
      name_objects.append(Name(each_line.split()))