如何使用python方法返回NEW类对象?

时间:2018-11-27 19:53:19

标签: python class oop methods

我对以下无效代码有疑问:

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

2 个答案:

答案 0 :(得分:0)

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

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 :(得分:0)

  1. 要返回DataBase对象调用DataBase(movies, schema),其中moviesschema是类__init__()方法的参数。
  2. __init__()可以根据需要使用任意数量的位置参数,但请记住将其对象分配给__init__()主体内的适当名称,以便以后使用(请参阅{{1} }方法)。
  3. 为避免在整个__init__()方法中重复搜索模式,只需使用search()参数作为匹配数据库中每个记录的键,然后将问题分为两种情况:一种为范围搜索,另一个用于普通搜索(请参见下面的field方法)。记住要解决不匹配的情况:在我的实现中,我只返回了一个空的search()对象。您还应该解决无效的搜索键的情况:在我的实现中,我返回DataBase

下面的None函数提供了一个数据库和三个搜索,既简单又在范围内。

您应该考虑将collections.namedtuple作为数据库记录的替代表示形式。

test()