Python 您可以在指定默认参数时使用self吗?

Python 您可以在指定默认参数时使用self吗?,python,Python,我正在尝试将一些java代码转换为python等效代码,以便能够在两者之间进行接口。因此,在Java中,我有如下代码: public int[] toArray(boolean order) { return toArray(order, this.length()); } public int[] toArray(boolean order, int length) { ... } def to_array(self, order): return self.to_arr

我正在尝试将一些java代码转换为python等效代码,以便能够在两者之间进行接口。因此,在Java中,我有如下代码:

public int[] toArray(boolean order) {
    return toArray(order, this.length());
}
public int[] toArray(boolean order, int length) {
    ...
}
def to_array(self, order):
  return self.to_array(order, self.length())
def to_array(self, order, length):
  ...
def to_array(self, order, length = self.length()):
  ...
python中的逻辑等价物可能如下所示:

public int[] toArray(boolean order) {
    return toArray(order, this.length());
}
public int[] toArray(boolean order, int length) {
    ...
}
def to_array(self, order):
  return self.to_array(order, self.length())
def to_array(self, order, length):
  ...
def to_array(self, order, length = self.length()):
  ...
除了。。。python不允许函数重载,而是允许使用默认参数,因此,同样,您希望执行以下操作似乎是合乎逻辑的:

public int[] toArray(boolean order) {
    return toArray(order, this.length());
}
public int[] toArray(boolean order, int length) {
    ...
}
def to_array(self, order):
  return self.to_array(order, self.length())
def to_array(self, order, length):
  ...
def to_array(self, order, length = self.length()):
  ...
然而。。。这在python中也是不允许的,可能是因为self在函数体中才真正“存在”

那么,在python中,正确的方法是什么呢?还是不可能


编辑:我意识到我在java代码中使用了void函数,该函数应该返回一个值,所以现在它们返回
int[]

,python的方法是使用
None
作为默认值,然后对其进行测试:

def to_array(self, order, length=None):
    if length is None:
        length = self.length()

python的方法是使用
None
作为默认值,然后对其进行测试:

def to_array(self, order, length=None):
    if length is None:
        length = self.length()

谢谢,这正是我想要的。虽然考虑到python喜欢将自己提升为一种易于编写干净外观的语言,但它似乎有一种更干净的方法来实现这一点code@JDOdle但正如您所说,“self在函数体中才真正“存在”,默认参数值在定义时设置。当您还没有完成类的定义时,不可能有实例!Python优先考虑可读性,其中一部分是一致的概念模型。@JDOdle我发现这是一种相当干净的方法。如果您想用5个不同的版本重载一个函数,这可能会变得更加乏味,但这是编译语言提供给您的一个优势。每种编程语言模型都有一些优点,但也有一些(可感知的)缺点。正如jonsharpe所说,这是关于每种语言认为什么更重要。关于私有方法也有类似的讨论。在一天结束时,按照语言鼓励的方式来处理代码,而不是在另一种语言中有意义的东西。@jornsharpe这是一个公平的观点,但我不认为在以后的参数中使用self会创建一个不一致的概念模型。从概念上讲,self只是传递给函数的另一个参数,它恰好是对被调用函数所有者的引用。为了证明我的观点在概念上是一致的,我将介绍C语言用于声明可变大小数组参数的语法,它使用了非常相似的语法。@JDOdle我不确定你是如何看待不同目标的不同语言在做某事的(你没有说确切的内容,我也不太熟悉C语言)作为在Python中保持一致的证据。同样,默认参数值在定义时被绑定,此时没有类,没有实例,也没有
self
或任何其他参数的值。如果要引用参数的值,必须在主体中进行;这就是一致性。谢谢,这正是我想要的。虽然考虑到python喜欢将自己提升为一种易于编写干净外观的语言,但它似乎有一种更干净的方法来实现这一点code@JDOdle但正如您所说,“self在函数体中才真正“存在”,默认参数值在定义时设置。当您还没有完成类的定义时,不可能有实例!Python优先考虑可读性,其中一部分是一致的概念模型。@JDOdle我发现这是一种相当干净的方法。如果您想用5个不同的版本重载一个函数,这可能会变得更加乏味,但这是编译语言提供给您的一个优势。每种编程语言模型都有一些优点,但也有一些(可感知的)缺点。正如jonsharpe所说,这是关于每种语言认为什么更重要。关于私有方法也有类似的讨论。在一天结束时,按照语言鼓励的方式来处理代码,而不是在另一种语言中有意义的东西。@jornsharpe这是一个公平的观点,但我不认为在以后的参数中使用self会创建一个不一致的概念模型。从概念上讲,self只是传递给函数的另一个参数,它恰好是对被调用函数所有者的引用。为了证明我的观点在概念上是一致的,我将介绍C语言用于声明可变大小数组参数的语法,它使用了非常相似的语法。@JDOdle我不确定你是如何看待不同目标的不同语言在做某事的(你没有说确切的内容,我也不太熟悉C语言)作为在Python中保持一致的证据。同样,默认参数值在定义时被绑定,此时没有类,没有实例,也没有
self
或任何其他参数的值。如果要引用参数的值,必须在主体中进行;这就是一致性。