0

我无法弄清楚要搜索什么,所以如果它已经在那里,我提前道歉,并且很乐意将搜索参考带到其他地方。

一些背景知识:我正在为python Excel 库开发一些额外的功能,我想做的一件事是在一次调用中将样式应用于一系列单元格。现在,我们的代码允许我们做一些像ws[1][1].font.bold = True加粗单元格 A1 之类的事情。我们还有一个范围运算符,它允许我们做一些事情,比如ws.range("A1:B2").value = 1将该范围内的所有值设置为 1。

我现在想做的是增加做事的能力ws.range("A1:B2").font.bold = True,但我不知道怎么做。range("A1:B2")是一个没有显式引用单元格的对象(只是两个角以节省空间),但没有显式地具有.fontor.value属性,而是通过@property装饰器拦截以适当地应用。

问题是,如果我添加一个@property装饰器来创建一个属性,我可以返回一个新的字体对象,但是在修改属性以将其应用于范围内的所有单元格font之后,我无法获取这个字体对象。bold

我在想我可以yield使用字体,然后在 之后添加应用逻辑yield,但这不能作为yield返回生成器。我能想到的唯一其他想法是创建一个显式.font对象,然后在Range类中覆盖.font.__setattr__以侦听更改,但是我不知道如何从__setattr__需要应用的范围内获取原始范围而不必创建第三个中介类。这不仅看起来很尴尬,而且看起来非常不合时宜。

这样的事情是否可能而不必采用相当深奥的方法?我希望我的解释很清楚,如果它已经存在,请随时向我指出现有的参考资料——我只是不知道要搜索什么。

4

1 回答 1

1

要扩展我的评论,您可以执行以下操作:

class RangeFont(object):

    def __init__(self, range):
        self._range = range

    def __setattr__(self, name, value):
        if name.startswith('_'):
            super(RangeFont, self).__setattr__(name, value)
            return

        for cell in self._range: # assuming a range is iterable
            setattr(cell.font, name, value)


class Range(object):
    @property
    def font(self):
        return RangeFont(self)

上述代码的一个限制是它不适用于更多级别的属性,也就是说,你不能做ws.Range(...).font.foo.bar = 123. (也就是说你可以通过RangeFont.__getattr__返回一个类似的包装对象来扩展它。)

于 2013-10-09T00:18:09.183 回答