Python,主要方法没有运行(同一个文件中有多个类)

时间:2017-11-06 11:13:49

标签: python

上下文 我开发了一个在远程linux服务器上运行的python脚本。使用Python 3.6.1运行。该脚本有效,但非常混乱,并且在程序上编写而不是OO。所以,我把这个脚本重写成了两个不同的类。一个主要类和一个对象的蓝图类。

我的脚本要复杂得多,我只是简化了这个问题。

所需功能 从CSV文件中读取值。从这些值创建对象,每行1个对象。对初始化对象(在对象类中)的值进行一些计算。可以从主类(基类)访问这些对象。

问题: 我需要澄清一下:

  1. 主要方法未运行。在方法调用上尝试了变体,比如Base.main(),包括Base类中的“if name”语句,并且它抱怨self未被定义
  2. “自我”参考。我的用法是正确的吗?例如:将属性“age”添加到Person对象中,以便您可以使用person.age访问它。我的方法调用“self.input_file_handling(Base.inputFilePath)”等。
  3. 脚本:

    import csv
    
    class Person:
        def calculate_age(self):
            self.age = 2017 - self.birthYear
    
        def __init__(self, name, birthYear):
            self.name = self.strip_characters(self, name)
            self.birthYear = int(birthYear)
            self.calculate_age()
    
    class Base:
    
        inputFilePath = "input.csv"
        people  = []
        def main():
            self.input_file_handling(Base.inputFilePath)
            #More methods here
    
        @staticmethod
        def input_file_handling(input_file_path):
    
            input_file_path = str(input_file_path)
    
            with open(input_file_path, 'r') as csv_file:
                csv_reader = csv.DictReader(csv_file)
    
                for line in csv_reader:
                        name = line['Name']
                        age = line['age']
                        person = Person(name, age)
                        people.append(person)
    
    if __name__ == '__main__':
        main()
    

3 个答案:

答案 0 :(得分:2)

首先,Base类的主要方法不是静态的,因为它使用自变量,所以必须接收它。

如果你想调用main方法并使用自变量,你需要做类似的事情:

class Base:
  def main(self):
    pass

if __name__ == '__main__':
  instance_of_base = Base()
  instance_of_base.main()

您可以在不使用self的情况下调用input_file_handling方法,因为它是静态的

Base.input_file_handling(Base.inputFilePath)

我认为您需要了解有关python如何解析静态事物以及类和对象变量的更多信息。

答案 1 :(得分:1)

Python不是C.没有main函数可以自动执行。

您定义的main 方法位于Base类内,但它不接受该实例的参数。

修改它以使其接受它(即约定的self)或使其成为静态方法。

然后在if __name__ == '__main__':中使用Base().main()Base.main(),具体取决于您决定采取的方法。

但是你似乎不需要这些,只是为了强迫Python看起来/像其他语言一样工作(看着你的C ++ / Java)。 Python并不要求你有一个类或'main'函数/方法来执行代码。

答案 2 :(得分:0)

用Pythonic方式编写的代码是:(Python3)

import csv
from time import time, gmtime


INPUT_FILE_PATH = "input.csv"


class Person:
    def __init__(self, name, birth_year):
        self.name = name.strip()
        self.birth_year = birth_year

    @property
    def birth_year(self):
        return self._birth_year

    @setter.birth_year
    def birth_year(self, value):
        self._birth_year = value
        self._age = gmtime(time()).tm_year - value

    @property
    def age(self):
        return self._age

    @setter.age
    def age(self, value):
        self._birth_year = gmtime(time()).tm_year - value
        self._age = value


def input_file_handling(input_file_path):
    people = []
    with open(input_file_path, 'r') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for line in csv_reader:
            people.append(Person(line['Name'], int(line['age'])))
    return people


if __name__ == '__main__':
    people = input_file_handling(INPUT_FILE_PATH)

你好像来自OOP语言(可能是C#?)。 一些提示:

  1. 当能够使用变量时避免使用全局变量,将它们用于函数定义,类定义和常量。
  2. 不要使用新类来存储不需要它的函数
  3. 使用小写字母和' '对于变量和函数名称,使用CamelCase作为类名,使用大写和' '对于常数。
  4. 使用duck typing:不要检查参数是否属于给定类型,尝试使用它就像它一样,并处理抛出异常(如果它不是。
  5. 属性是你的朋友,如果你想强制特定的行为来获取或设置一个类属性
  6. 如果你不理解评论中的某些问题。