Python - 设置类属性依赖于同类其他属性的值

2 投票
1 回答
3387 浏览
提问于 2025-04-16 12:36

抱歉,如果这个问题在其他地方已经被问过,但我不太确定该怎么问,而且搜索也没有找到什么有用的信息。

在Python(2.6.x)中,我创建了一个类

class timetuple(object):
    def __init__(self):
        self.weekday = 6
        self.month   = 1
        self.day     = 1
        self.year    = 2011
        self.hour    = 0
        self.min     = 0
        self.sec     = 0
    def jd(self):
        self.jd = julian_date(self)

def julian_date(obj):
    (Code to calculate a Julian Date snipped)

start = timetuple()
start.day   = 23
start.month = 2
start.year  = 2011
start.hour  = 13
start.min   = 30
start.sec   = 0

print start.__dict__
start.jd()
print start.__dict__
print start.jd

这个类返回

{'hour': 13, 'min': 30, 'month': 2, 'sec': 0, 'weekday': 6, 'year': 2011, 'date': 23, 'day': 1}
{'hour': 13, 'min': 30, 'month': 14, 'jd': 2455594.0625, 'sec': 0, 'weekday': 6, 'year': 2010, 'date': 23, 'day': 1}
2455594.0625

所以在调用start.jd()之前,.jd这个属性(或者我该称它为函数还是方法?说实话我对这些术语不太确定)是不存在的。有没有办法让我可以重写这个,让它总是根据timetuple类中的当前值存在,或者在调用.jd属性时自动更新呢?

我知道可以通过在init(self)部分直接创建一个.jd属性,然后做类似这样的事情

start = timetuple()
start.jd = julian_date(start)

但我其实想知道怎么更好地设置我的类 :)

1 个回答

10

你想要真正定义一个属性,而不是一个变量:

class A(object):

    def __init__(self):
        self.a = 1
        self.b = 1

    @property
    def a_plus_b(self):
        return self.a + self.b

foo = A()
print foo.a_plus_b # prints "2"
foo.a = 3
print foo.a_plus_b # prints "4"
foo.b = 4
print foo.a_plus_b # prints "7"

撰写回答