重用Python类中参数最多的重载方法

问题描述 投票:0回答:1

我有 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 methods overloading reusability
1个回答
0
投票

在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()
© www.soinside.com 2019 - 2024. All rights reserved.