Python:循环并分配嵌套对象属性的简单方法?

时间:2014-01-09 16:34:24

标签: python variable-assignment

我有一个我希望重新分配的对象属性列表。某些属性位于嵌套对象中。是否有一种简单的方法可以使用单个循环或其他方式分配所有这些属性。

这是我的示例代码:

from datetime import datetime
import time

class Foo:
  pass

class Bar:
  pass

now = time.time()

foo = Foo()
foo.time1 = now
foo.time2 = now + 1000
foo.other = 'not just times'

foo.bar = Bar()
foo.bar.btime1 = now - 1000
foo.bar.btime2 = now - 2000
foo.bar.bother = 'other stuff'

## seemingly easy way
# just sets time to reference the result, doesn't alter foo
for time in foo.time1, foo.time2, foo.bar.btime1, foo.bar.btime2:
  time = datetime.fromtimestamp( time ).strftime('%c')

## 'dirty' way
for time in 'time1', 'time2':
  val = getattr(foo, time)
  val = datetime.fromtimestamp( val ).strftime('%c')
  setattr( foo, time, val )

# have to do another loop for each nested object
for time in 'btime1', 'btime2':
  val = getattr(foo.bar, time)
  val = datetime.fromtimestamp( val ).strftime('%c')
  setattr( foo.bar, time, val )

# goal is to format everything nicely...
print (
    'Time1:  {0.time1}\n'
    'Time2:  {0.time2}\n'
    'Other:  {0.other}\n'
    'BTime1: {0.bar.btime1}\n'
    'BTime1: {0.bar.btime2}\n'
    'BOther: {0.bar.bother}'
    ).format(foo)

作为我的python noob,我首先尝试循环遍历这些属性,显然这些原因并没有得到很好的记录。我能看到的唯一选择是使用setattr,但这对嵌套对象不起作用,如图所示。虽然它“感觉”应该有一种更简单的方法来进行分配,因为用其他语言的指针实现这是一件简单的事情。

要清楚这个问题是关于嵌套对象的分配。但是,由于我显然试图将包含时间戳的对象转换为包含格式化日期/时间字符串的对象并打印出来,因此有关如何获取格式化输出的任何其他建议都会有所帮助:)

1 个答案:

答案 0 :(得分:2)

一般来说,这种事情实际上是一个设计问题,只是假装是一个实现问题。要解决它,请重新组织,以便您事先做好工作。当然,大概是你第一次没有这样做的原因是为了避免重复时间格式化代码。但简单地说,解决方案变得显而易见:将其包装在一个函数中。

def formatted_time(timestamp):
    return datetime.fromtimestamp(timestamp).strftime('%c')

foo = Foo()
foo.time1 = formatted_time(now)
foo.time2 = formatted_time(now + 1000)
foo.other = 'not just times'

foo.bar = Bar()
foo.bar.btime1 = formatted_time(now - 1000)
foo.bar.btime2 = formatted_time(now - 2000)
foo.bar.bother = 'other stuff'