【问题标题】:How to return with a python method A NEW class object?如何使用 python 方法返回一个新的类对象?
【发布时间】:2019-04-29 15:13:32
【问题描述】:

我对下面不工作的代码有一些疑问:

  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**

【问题讨论】:

  • 你读过Tutorial for Classes吗?
  • field_value1 是否总是与movie[field_name] 进行比较?如果field_value2 存在,是否意味着搜索一系列值?
  • 看起来某些字段的搜索返回一个列表,而其他字段返回一个单一的东西。您可能需要创建两组字段名,以帮助区分两者。
  • 是的,如果存在field_value2,它应该只搜索一个值范围。并且,搜索函数应该返回一个新的数据库对象,其中只包含搜索找到的电影。我退回了清单和其他东西,因为我不知道该怎么做。

标签: python class oop methods


【解决方案1】:

不清楚您要做什么,如果没有 输入 的示例和所需结果的示例,很难解释,但这可能很接近。

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)

您甚至可能希望简化搜索中的比较。您可以为(两种)不同类型的比较定义辅助函数;根据参数选择要使用的比较;然后在搜索中使用 chosen 函数。

...

    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 为空 - 未找到电影。

【讨论】:

    【解决方案2】:
    1. 返回一个DataBase对象调用DataBase(movies, schema),其中movies和schema是类的__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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多