是否有任何方法可以缩短具有类似语句但返回不同的属性?

2024-10-17 08:27:59 发布

您现在位置:Python中文网/ 问答频道 /正文

class....

    @property
    def degrees(self):
        hem, degs, mins, secs = self._correction()
        return degs

    @property
    def minutes(self):
        hem, degs, mins, secs = self._correction()
        return mins

    @property
    def seconds(self):
        hem, degs, mins, secs = self._correction()
        return secs

我在想,def可以像这样被截断:

@property
def hemisphere, degrees, minutes, seconds(self):
    hem, degs, mins, secs = self._correction()
    return hem, degs, mins, secs

因此,当我调用“半球”时,它将返回hem值,依此类推

附言。 我知道我在后者中的return语句是错误的。我希望你明白我的意思


Tags: selfreturndefpropertyclasssecondsdegreessecs
3条回答

您可以重写__getattr__方法

def __getattr__(self, item):
    values = ["hemisphere", "degrees", "minutes", "seconds"]
    if item in values:
        return self._correction()[values.index(item)]
    raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{item}'")

正如@xjcl所评论的,基于简单而不是看似不必要的复杂化/模糊化:

class....

    @property
    def degrees(self):
        return self._correction()[1]

    @property
    def minutes(self):
        return self._correction()[2]

    @property
    def seconds(self):
        return self._correction()[3]

有很多方法可以缩短它,我将编写另一个助手函数:

from functools import wraps

def unpack(rng, fn, propertize=False):
    for i in rng:
        @wraps(fn)
        def wrapper(*args, __i=i, **kwargs):
            return fn(*args, **kwargs)[i]
        yield property(wrapper) if propertize else wrapper

class Something:
    hemisphere, degrees, minutes, seconds = unpack(
        range(4), Something._correction, propertize=True
    )

相关问题 更多 >