在一种方法中,我解析了一个 CSV 文件。在每次迭代中,我都会从该条目中创建一个对象。鉴于该对象代表该 CSV 文件中的一行,如果它是有序的,那么阅读起来会容易得多,而不仅仅是 return self.__dict__
class Student:
def __init__(self, name, grade, classes):
self.name = name
self.grade = grade
self.classes = classes
def __repr__(self):
return #ordered version of self
CSV 函数:
with open(arguments.csv, 'rb') as csv_file:
csv_data = csv.reader(csv_file)
data = [Student(*row) for row in csv_data]
预期输出(包含“ pretty-print ”,与原始初始化匹配):
Student:
name: 'Crow',
grade: 1,
classes: ['pecking', 'cawing', 'scavenging', 'advanced film theory']
Student:
name: 'Odin',
grade: 9999,
classes: ['Norse Mythology', 'Orithonology']
如何在不硬编码的情况下以有序的方式表示它?
最佳答案
您的 __init__
方法的名称已排序;它们恰好与您的 __dict__
键匹配,因此您可以使用它们:
import inspect
class Student(object):
def __init__(self, name, grade, classes):
self.name = name
self.grade = grade
self.classes = classes
def __repr__(self):
return '{}\n{}'.format(type(self).__name__,
'\n'.join([' {}: {!r}'.format(name, getattr(self, name))
for name in inspect.getargspec(self.__init__).args[1:]]))
在这里,inspect.getargspec()
返回self.__init__
方法的签名信息; .args
是位置参数。将其切片为 [1:]
会跳过第一个参数 self
。
演示:
>>> Student('Crow', 1, ['pecking', 'cawing', 'scavenging', 'advanced film theory'])
Student
name: 'Crow'
grade: 1
classes: ['pecking', 'cawing', 'scavenging', 'advanced film theory']
关于python - 按照 init 中显示的顺序表示一个类,无需硬编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22334838/