我有 LCD 类,由 micropython 在树莓派 pico 上运行,我像这样初始化:
class Lcd:
def __init__(self, width, height, channel, sdaPin, sclPin, contrast):
from time import sleep
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
self.contrast = contrast
self.sleep = sleep
self.width = width
self.height = height
self.channel = channel
self.i2cLCD = I2C(self.channel, sda=Pin(sdaPin), scl=Pin(sclPin), freq=400000)
self.dsp=SSD1306_I2C(self.width,self.height,self.i2cLCD)
并在主程序中初始化一个对象,如下所示:
lcd = Lcd(128,64,1,26, 27, 1)
但是我有一个问题,我在Python(micropython)中找不到答案。例如。在java中你可以重载这样的方法,没有任何问题:
double calculateBalance(double income, double expenses){
return income - expenses;
}
double calculateBalance(){
return this.calculateBalance(100, 80); // only as example, it can be some default params
}
所以我可以在对象上调用这些方法中的任何一个,无论有没有参数。如果没有参数,我默认为某些东西,而有了参数,我可以指定它们。因此,通过重用具有大多数参数的方法来节省代码。然而,当我尝试在 python 中对我之前显示的 LCD 类的 .text() 方法做类似的事情时:
def text(self, txt, startXPx, startYPx , colsCount, rowsCount, dsp):
# some logic for this method to display text on LCD
self.dsp.show()
def text(self, txt):
# just calling upper method with default params
self.text( txt, 0, 0, self.width/8, self.height/10, 1)
当调用方法时:
lcd.text('my text')
我收到错误:
MPY: soft reboot
Traceback (most recent call last):
File "<stdin>", line 60, in <module>
File "<stdin>", line 50, in text
TypeError: function takes 2 positional arguments but 7 were given
问题是为什么它给我错误以及我怎样才能实现这个目标?
在Python中,您可以简单地在一个方法声明中指定默认值,而不是通过创建多个同名的方法来设置默认参数值。然而,这些默认值是在您声明方法时而不是在调用它时计算的,因此在某些情况下(例如
colsCount
和 rowsCount
),您可能必须将默认值设置为 None
并在方法体:
def text(self, txt, startXPx = 0, startYPx = 0, colsCount = None, rowsCount = None, dsp = 1):
if colsCount is None:
colsCount = self.width/8
if rowsCount is None:
rowsCount = self.height/10
# some logic for this method to display text on LCD
self.dsp.show()