【问题标题】:Splitting Data in Python?在 Python 中拆分数据?
【发布时间】:2020-12-11 14:17:19
【问题描述】:

它不起作用。我想将数据拆分为行属性中的代码。

class movie_analyzer:
    def __init__(self,s):
        for c in punctuation:
            import re

            moviefile = open(s, encoding = "latin-1")
            movielist = []
            movies = moviefile.readlines()
  
    def lines(movies):
        for movie in movies:
                if len(movie.strip().split("::")) == 4:
                    a = movie.strip().split("::")
                    movielist.append(a)

        return(movielist)

movie = movie_analyzer("movies-modified.dat")

movie.lines

它返回:

【问题讨论】:

  • 似乎没有什么理由让它成为一个类,而不是一个简单的函数。

标签: python function class oop attributes


【解决方案1】:

您可以使用@property 装饰器来访问方法的结果作为属性。看看这个装饰器如何使用的非常简单的例子:

import random

class Randomizer:
    def __init__(self, lower, upper):
        self.lower = lower
        self.upper = upper
    
    @property
    def rand_num(self):
        return random.randint(self.lower, self.upper)

然后,您可以像这样访问它:

>>> randomizer = Randomizer(0, 10)
>>> randomizer.rand_num
5
>>> randomizer.rand_num
7
>>> randomizer.rand_num
3

显然,这是一个无用的例子;但是,您可以采用此逻辑并将其应用于您的情况。

另外,还有一件事:您没有将self 传递给lines。您传递了movies,这是不需要的,因为您可以使用self.movies 访问它。但是,如果您想使用 self 访问这些变量,您必须设置(在您的 __init__ 方法中):

self.movielist = []
self.movies = moviefile.readlines()

【讨论】:

    【解决方案2】:

    要调用函数,请使用 movie.lines() 和参数。您所做的只是访问方法声明。此外,请确保在方法定义中使用 self 作为参数并保存您希望 Object 具有的参数。将导入文件放在文件的开头通常是一个好习惯。

    import re
    
    class movie_analyzer:
        def __init__(self,s):
            for c in punctuation:    
                moviefile = open(s, encoding = "latin-1")
                self.movielist = []
                self.movies = moviefile.readlines()
    
        @property
        def lines(self):
            for movie in self.movies:
                    if len(movie.strip().split("::")) == 4:
                        a = movie.strip().split("::")
                        self.movielist.append(a)
    
            return self.movielist
    
    movie = movie_analyzer("movies-modified.dat")
    
    movie.lines()
    

    【讨论】:

    • 谢谢,它是这样运行的。但我想将它作为movie.lines 运行。我应该如何更改代码?
    • 我在编辑时牢记@gmdev 给出的答案。让我知道它是否有效,如果有效,请接受答案
    猜你喜欢
    • 2023-01-20
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多