Python 按照init中显示的顺序表示一个类,不使用硬编码
在一种方法中,我解析CSV文件。在每次迭代中,我从该条目中生成一个对象。考虑到该对象表示该CSV文件中的一行,如果它是有序的,那么读取起来就容易多了,而不仅仅是Python 按照init中显示的顺序表示一个类,不使用硬编码,python,python-2.7,csv,Python,Python 2.7,Csv,在一种方法中,我解析CSV文件。在每次迭代中,我从该条目中生成一个对象。考虑到该对象表示该CSV文件中的一行,如果它是有序的,那么读取起来就容易多了,而不仅仅是返回self class Student: def __init__(self, name, grade, classes): self.name = name self.grade = grade self.classes = classes def __repr__(self): return
返回self
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]
预期输出(包括“漂亮打印”,与原始初始匹配):
如何在不硬编码的情况下以有序的方式表示它?您的\uuu init\uuu
方法的名称是有序的;它们恰好与您的\uuuu dict\uuuu
键匹配,因此您可以使用这些键:
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:]]))
这里,返回self.\uuu init\uu
方法的签名信息.args
是位置参数。将其切片到[1:][/code>将跳过第一个参数self
演示:
您的\uuuu init\uuuu
方法的名称已排序;它们恰好与您的\uuuu dict\uuuu
键匹配,因此您可以使用这些键:
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:]]))
这里,返回self.\uuu init\uu
方法的签名信息.args
是位置参数。将其切片到[1:][/code>将跳过第一个参数self
演示:
我通常更喜欢声明而不是内省:
import itertools
class Student(object):
columns = ('name', 'grade', 'classes')
def __init__(self, *row):
self.row = _,_,_ = row # Aaaaah, dragons !
def __getattr__(self, key):
if key in self.columns:
return self.row[self.columns.index(key)]
def __repr__(self):
return '{}\n{}'.format(
type(self).__name__,
'\n'.join((' {}: {!r}'.format(*item)
for item in itertools.izip(self.columns, self.row) ))
)
您甚至可以添加通用触摸:
import itertools
class Row(object):
columns = ()
def __init__(self, *row):
if len(row) != len(self.columns):
raise TypeError('{}() takes {} argument'.format(
type(self).__name__, len(self.columns)))
self.row = row
def __getattr__(self, key):
if key in self.columns:
return self.row[self.columns.index(key)]
def __repr__(self):
return '{}\n{}'.format(
type(self).__name__,
'\n'.join((' {}: {!r}'.format(*item)
for item in itertools.izip(self.columns, self.row) ))
)
class Student(Row):
columns = ('name','grade','classes')
我通常更喜欢声明而不是内省:
import itertools
class Student(object):
columns = ('name', 'grade', 'classes')
def __init__(self, *row):
self.row = _,_,_ = row # Aaaaah, dragons !
def __getattr__(self, key):
if key in self.columns:
return self.row[self.columns.index(key)]
def __repr__(self):
return '{}\n{}'.format(
type(self).__name__,
'\n'.join((' {}: {!r}'.format(*item)
for item in itertools.izip(self.columns, self.row) ))
)
您甚至可以添加通用触摸:
import itertools
class Row(object):
columns = ()
def __init__(self, *row):
if len(row) != len(self.columns):
raise TypeError('{}() takes {} argument'.format(
type(self).__name__, len(self.columns)))
self.row = row
def __getattr__(self, key):
if key in self.columns:
return self.row[self.columns.index(key)]
def __repr__(self):
return '{}\n{}'.format(
type(self).__name__,
'\n'.join((' {}: {!r}'.format(*item)
for item in itertools.izip(self.columns, self.row) ))
)
class Student(Row):
columns = ('name','grade','classes')
啊,玛蒂金,你真是一个genius@crow没有人会怀疑,但请少用助长自豪感的字眼啊,玛蒂金,你真是一个genius@crow没有人怀疑这一点,但要谨慎使用助长自豪感的词语