所以我最近潜入了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 :(得分: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