上下文 我开发了一个在远程linux服务器上运行的python脚本。使用Python 3.6.1运行。该脚本有效,但非常混乱,并且在程序上编写而不是OO。所以,我把这个脚本重写成了两个不同的类。一个主要类和一个对象的蓝图类。
我的脚本要复杂得多,我只是简化了这个问题。
所需功能 从CSV文件中读取值。从这些值创建对象,每行1个对象。对初始化对象(在对象类中)的值进行一些计算。可以从主类(基类)访问这些对象。
问题: 我需要澄清一下:
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()
答案 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#?)。 一些提示:
如果你不理解评论中的某些问题。