如何通过更改另一个属性的值来更改一个属性的值? (依赖属性)

时间:2014-12-05 04:02:48

标签: python class oop python-3.x python-3.4

所以我最近潜入了OOP,到目前为止一切都很顺利。虽然我本身没有任何问题,但我希望存在一个令人惊奇的功能,尽管我找不到有关该功能的任何文档。

在为对象分配属性时,我经常发现我必须改变依赖于其他属性的属性,比如光明和黑暗。这是一个例子:

class shade:

    def __init__(self, light):
        self.light=light
        self.darkness=100-light

    def __str__(self):
        return (str(self.light) +  ',' + str(self.darkness))



>>> shade1=shade(30,70)
>>> shade1.light
30
>>> shade1.darkness
70

现在,虽然这很酷,但我想要的是同一个过程,但如果一个属性发生变化,则在同一个对象中。如果我重置光的属性(哦是的),我希望黑暗相应地加入/减少。我可以用一个函数来做这个,如果它可以改变光的属性,返回光/暗的新值,但是如果我只是通过重新赋值来改变光的属性,我想要一种方法来做到这一点,没有使用功能,像这样:

>>> shade1.light=50
>>> shade1.light
50
>>> shade1.darkness
50

另外,作为OOP的新手,如果有人知道一些好的教程,那也将是一个巨大的帮助。

提前致谢。

1 个答案:

答案 0 :(得分:13)

darkness定义为property

class shade:
    def __init__(self, light):
        self.light=light

    @property
    def darkness(self):
        return 100 - self.light

    def __str__(self):
        return (str(self.light) +  ',' + str(self.darkness))

属性向外显示为属性,但在内部充当函数调用。当您说s.darkness时,它会调用您为其财产提供的功能。这允许您仅在内部维护一个变量。

如果您希望能够通过指定黑暗来修改它,请为该属性添加setter

class shade:
    def __init__(self, light):
        self.light=light

    @property
    def darkness(self):
        return 100 - self.light

    @darkness.setter
    def darkness(self, value):
        self.light = 100 - value

从而实际上修改光。如果您之前从未见过属性,我建议您在函数体中加入一些print(),以便查看它们何时被调用。

>>> s = shade(70)
>>> s.light
70
>>> s.darkness
30
>>> s.light = 10
>>> s.darkness
90
>>> s.darkness = 20
>>> s.light
80