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

发布于 2021-01-29 18:19:32

因此,我最近开始涉足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的新手,如果有人知道一些好的教程,那也将是巨大的帮助。

提前致谢。

关注者
0
被浏览
274
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    定义darkness属性

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看