【发布时间】:2018-04-17 22:30:19
【问题描述】:
定义具有大量属性的类的最简洁方法是什么,每个属性都调用具有不同参数的相同 setter 函数?
以下是我想要实现的目标。三个属性(red_LED 等)中的每一个都在设置时调用相同的 TalkToHardware() 函数,但地址不同。如您所见,这是可行的,但类定义又长又笨重。它也容易出错。
class Hardware_Controller(object):
def __init__(self):
self.red_LED_address = 0
self.blue_LED_address = 1
self.green_LED_address = 2
@property
def red_LED(self):
return self._red_LED_status
@red_LED.setter
def red_LED(self,value):
self.TalkToHardware(self.red_LED_address,value)
self._red_LED_status = value
@property
def blue_LED(self):
return self._red_LED_status
@blue_LED.setter
def blue_LED(self,value):
self.TalkToHardware(self.blue_LED_address,value)
self._blue_LED_status = value
@property
def green_LED(self):
return self._red_LED_status
@green_LED.setter
def green_LED(self,value):
self.TalkToHardware(self.green_LED_address,value)
self._green_LED_status = value
def TalkToHardware(self,address,value):
print('Sending %i to address %i' % (value,address))
if __name__ == "__main__":
a = Hardware_Controller()
a.red_LED = 1
a.green_LED = 0
print(a.red_LED)
输出:
Sending 1 to address 0
Sending 0 to address 2
1
我希望类定义看起来更像这样:
class Hardware_Controller(object):
def __init__(self):
self.red_LED_address = 0
self.blue_LED_address = 1
self.green_LED_address = 2
self.red_LED = some_magic(self.red_LED_address)
self.blue_LED = some_magic(self.blue_LED_address)
self.green_LED = some_magic(self.green_LED_address)
def some_magic(address):
# Do magic things
pass
是否有一种干净的方法来完成此操作,仍然能够直接访问每个 LED,如第一个示例的主要功能所示?
【问题讨论】:
-
property只是一个描述符工厂,请参阅docs.python.org/3/howto/descriptor.html 了解如何编写它们。 -
您能澄清一下您要做什么吗? 'some_magic' 返回一个函数吗?没有描述
some_magic应该做什么 -
@JayFresco some_magic 将 self.red_LED 初始化为与第一个示例中的 self.red_LED 具有相同行为的对象。
标签: python properties