我有一个有几个属性的类:
class Fighter():
def __init__(self, name = "", gender = "", age = 0, weight = 0, win = 0, loss = 0, ko = 0, date = ""):
self.__name = name
self.__age = age
self.__weight = weight
self.__win = win
self.__loss = loss
self.__ko = ko
self.__date = date
从我的程序的用户端,创建一个对象并使用循环中的以下行存储在列表中:
s = Fighter(name, gender, age, weight, wins, losses, ko, time)
collection.append(s)
我能够通过许多属性对此列表进行排序,例如名称,重量等,并且完美无缺。我在类中也有实例方法,它返回特定属性的值,例如:
def fighter_age(self):
return str(self.__age)
我的问题是,如何将此信息打印为有组织的表格,并为每个属性添加一列,例如:
-----------------------------------------------------------------------
|Fighter Number|Name |Age |Weight |Wins|Losses|Date Added |
|1 |Anderson Silva|39 |185 |33 | 6 |2014-01-17 |
答案 0 :(得分:0)
检查重复的链接,并考虑:
import sys
def prt_width(str, width):
sys.stdout.write('|' + str + ' '*(width-len(str)) + '|')
sys.stdout.flush()
for fighter in collection:
prt_width(fighter.number)
prt_width(fighter.name)
...
prt_width('\n')
注意:这需要您提前计算每个字段的最大长度(例如,您需要遍历所有名称并在提交所有名称之前确定所有名称的最大长度,或者只是找到一个标准通常有用的价值)。这是一种手动方法,出于某种原因,我倾向于采用手动方法来学习东西。检查重复的链接,找到适合您的好库:)
答案 1 :(得分:0)
如果你想对此有点聪明,并使用一些类给你的功能,你可以将每个实例属性的最宽条目的宽度存储为类属性:
class Fighter():
max_name_len = 4 # start with width of header 'Name'
...
def __init__(self, name, ...):
if len(name) > Fighter.max_name_len :
Fighter.max_name_len = len(name)
...
每次创建新的Fighter
或更改其中一个属性时,都可以更新这些类属性(有关如何使用检查代码包装可能更改的属性,请参阅property
)。这使您无需在每次构建表时循环collection
。
然后,您可以创建一个实例方法来为每个实例生成行条目:
def table_row(self, num): # note argument for fighter number
# return string with appropriate widths
以及执行标题的类方法:
@classmethod
def table_header(cls):
# return strings with headers
然后当您打印出表格时,它看起来像:
print Fighter.table_header()
for num, fighter in enumerate(collection, 1):
print fighter.table_row(num)
此处enumerate
为Fighter
中的每个collection
提供了数字,从1
开始,以及实际的Fighter
个对象。