【发布时间】:2021-08-15 07:10:33
【问题描述】:
我已经创建了一个类来表示我的 LED 灯带,并且我想在停止灯带时关闭灯带(也就是当程序停止并且对象被破坏时)。因此,就像我在 C++ 中所做的那样,我创建了一个析构函数来做到这一点。但看起来 Python 在 销毁该对象之后调用它。然后我得到一个分段错误错误。
这是我的类,析构函数只需要调用函数将每个 LED 的颜色设置为 0。
class LedStrip:
def __init__(self, led_count, led_pin, led_freq_hz, led_dma, led_invert, led_brightness, led_channel, color = MyColor(0,0,0)):
self.__strip = Adafruit_NeoPixel(led_count, led_pin, led_freq_hz, led_dma, led_invert, led_brightness, led_channel)
self.__color = color
self.__strip.begin()
def __del__(self):
self.__color = MyColor(0,0,0)
self.colorWipe(10)
# ATTRIBUTS (getter/setter)
@property
def color(self):
return self.__color
@color.setter
def color(self, color):
if isinstance(color, MyColor):
self.__color = color
else:
self.__color = MyColor(0,0,0)
def __len__(self):
return self.__strip.numPixels()
# METHODS
def colorWipe(self, wait_ms=50):
"""Wipe color across display a pixel at a time."""
color = self.__color.toNum()
for i in range(self.__strip.numPixels()):
self.__strip.setPixelColor(i, color)
self.__strip.show()
time.sleep(wait_ms/1000.0)
MyColor 只是我用来表示 RGB 颜色的一个类。在 Python 中完成该任务的正确方法是什么?我来自 C++,因此我的 OOP 方法实际上是面向 C++ 的,所以我在以 pythonic 方式思考时遇到了一些困难。
提前致谢
【问题讨论】:
-
"但是看起来 Python 在销毁对象后调用了它。" - 首先,不,Python 不这样做。其次,
__del__是终结器,而不是析构函数。在垃圾收集语言中,试图依赖对象销毁作为清理触发器是一个坏主意。 -
我真的不知道,我在寻找解释时读到了。好的,所以这是一种不同的思维方式。唯一的方法是创建我自己的函数并调用它?为什么我喜欢析构它,因为它是自动的,不需要调用它
-
python 中最常见的模式是 上下文管理器,即支持
with语句的对象 -
顺便说一句,请停止使用双下划线。人们可能已经告诉过你,双前导下划线在 python 中是“私有的”。但他们错了。理解这一点非常重要,Python 没有访问修饰符,并且所有内容实际上都是公开的。惯例是使用 single 前导下划线来表示某些属性或方法不是公共 API 的一部分
-
好的,我将删除双下划线。同样是我的“C++ 方面”需要属性的隐私 ^^ 但这意味着我的属性存在在类之外被修改的风险,不是吗?
标签: python oop destructor