繁体   English   中英

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

[英]Python: easy way to loop through and assign nested object attributes?

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

这是我的示例代码:

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 ,但这对嵌套对象不起作用,如图所示。 虽然它'感觉'应该有一种更简单的方法来进行分配,因为这是用其他语言指针实现的简单方法。

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

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

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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM