簡體   English   中英

如何使用python方法返回一個新的類對象?

[英]How to return with a python method A NEW class object?

我對以下不起作用的代碼有一些疑問:

  1. 如何使方法搜索返回一個新的數據庫對象?
  2. __init__可以將模式和list作為參數(這是一個字典list - 我在哪里搜索)?
  3. 如何避免一次又一次地在搜索方法中編寫類似的函數,導致數據庫中有很多字段名。

在此先感謝您的幫助。

class DataBase():  
# Searches Movies by title and gives its entire info :( (stupid)
def __init__(self, movies, schema):
    pass


def search(self, field_name, field_value1, field_value2=None):
    if field_name=='title':
        mov=[]
        for movie in movies:
            if field_value1 == movie['movie_title']:
                mov.append(movie)
        return mov

    if field_name=='year':
        for movie in movies:
            if field_value2:
                if movie['title_year'] in range (field_value1, field_value2+1):
                     return movie['movie_title'],movie['title_year']

            else:
                if movie['title_year']==field_value1:
                     return movie['movie_title'],movie['title_year']

    if field_name=='actor_1_name':
        mov=[]
        for movie in movies:
            if field_value1 == movie['actor_1_name']:
                mov.append(movie)
        return mov
        **strong text**

目前還不清楚你要做什么,如果沒有輸入和期望結果的例子,很難解釋,但這可能很接近。

class DataBase():  
    def __init__(self, movies, schema):
        self.movies = movies
        self.schema = schema

    def search(self, field_name, field_value1, field_value2=None):
        search_result = []
        for movie in self.movies:
            if field_value2:
                if movie[field_name] in range((field_value1, field_value2+1)):
                    search_results.append(movie)
            else:
                if movie[field_name] == field_value1:
                    search_results.append(movie)

        return DataBase(search_results, self.schema)

您甚至可能希望簡化搜索中的比較。 你可以為(兩種)不同類型的比較定義輔助函數; 根據參數選擇要使用的比較; 然后在搜索中使用所選的功能。

...

    def search(self, field_name, field_value1, field_value2=None):

        # comparison types    
        def range_comparison(movie, start=field_value1, end=field_value2):
            return movie[field_name] in range(start, end+1)
        def equality_comparison(movie, name=field_value1):
            return movie[field_name] == name

        # which comparison to use    
        comparison = range_comparison if field_value2 else equality_comparison

        search_result = []
        for movie in self.movies:
            if comparison(movie):
                search_results.append(movie)
        # or
        # search_results = [movie for movie in movies if comparison(movie)]
        return DataBase(search_results, self.schema)

由於某種原因,它吸引我,因為它將比較類型的邏輯與實際搜索分開。


它不會將search_results視為空 - 未找到電影。

  1. 返回DataBase對象調用DataBase(movies, schema) ,其中moviesschema是類的__init__()方法的參數。
  2. __init__()可以根據需要使用盡可能多的位置參數,但是記得將它們的對象分配給__init__()體內的適當名稱,以便以后可以使用它們(請參閱我的類中的__init__()方法)。
  3. 為了避免在search()方法中重復搜索模式,只需使用field參數作為匹配數據庫中每條記錄的鍵,並在兩種情況下拆分問題:一個用於范圍搜索,另一個用於純搜索(參見下面的search()方法)。 請記住解決不匹配的情況:在我的實現中,我只返回一個空的DataBase對象。 您還應該解決無效搜索鍵的情況:在我的實現中,我返回None

下面的test()函數提供了一個數據庫和三個搜索,既簡單又在一個范圍內。

您應該將collections.namedtuple視為數據庫記錄的替代表示。

class DataBase():

    def __init__(self, movies, schema):
        self.movies, self.schema = movies, schema

    def __str__(self):
        return str(self.movies)

    def search(self, field, from_value, to_value=None):
        if field in self.schema:
            matches = []
            if to_value:
                for movie in self.movies:
                    if movie[field] in range(from_value, to_value):
                        matches.append(movie)
            else:
                for movie in self.movies:
                    if movie[field] == from_value:
                        matches.append(movie)
            return DataBase(matches, self.schema)
        else:
            return None

def test():
    schema = [ "title", "year", "rating" ]
    movies = [
        { "title":"Star Wars: The Empire Strikes Back",       "year":1980, "rating":3 },
        { "title":"Serenity",                                 "year":2005, "rating":5 },
        { "title":"Scarface",                                 "year":1983, "rating":4 },
        { "title":"Harry Potter and the Philosopher's Stone", "year":2001, "rating":2 },
        ]

    db = DataBase(movies, schema)
    print(db.search("title", "Scarface"))
    print(db.search("year", 2000, 2008))
    print(db.search("rating", 4, 6))
    print(db.search("title", "The Last Emperor"))
    print(db.search("invalid", "value"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM