【问题标题】:Python - default value in class method and <code>self</code>Python - 类方法和 <code>self</code> 中的默认值
【发布时间】:2018-08-20 15:16:44
【问题描述】:

我有以下类和方法:

class Basis(object):

 def __init__(self, P = {'dimension': 1, 'generation':1}):

  self.P = P
  self.P['angle'] = np.pi/4

其中 P 是不包括'angle'dict,因此我在构造函数中设置它(角度现在是固定的,但我可能将它作为用户定义的函数未来)。

现在我有一个方法:

def make_projection(self, dimension, angle = np.pi/4):
 return (angle*3)

我想将此函数中angle的默认值设置为构造函数中定义的self.P['angle']
我不想在函数的主代码中使用self.P['angle'],因为我可能会单独使用该方法,给它一个不同的角度。

如果我只是这样做: def make_projection(self, dimension, angle = self.P['angle']): ,它会同时强调self,我不明白为什么。

--

我可以这样做吗?

【问题讨论】:

    标签: python class constructor


    【解决方案1】:

    首先,方法中的关键字参数的默认值不能是可变对象,例如listdict 等。Here 你可以阅读原因。

    其次,在def make_projection(self, dimension, angle = self.P['angle']) 中,self 变量仍未定义,因此您只能在方法体中获取self.P

    试试这个:

    class Basis(object):
    
      def __init__(self, P=None):
        self.P = P or {'dimension': 1, 'generation':1}
        self.P['angle'] = np.pi/4
    
      def make_projection(self, dimension, angle=None):
        angle = angle if angle is not None else self.P['angle']  # we must compare to None, because angle can be 0.
        return angle*3
    

    【讨论】:

    • 它们可以是可变对象,但它们不应该是由于对新手的影响和违反直觉的行为,他们可能期待不同的行为。
    【解决方案2】:

    定义函数时计算参数的 Python 默认值,而不是在调用函数时。

    您需要执行以下操作:

    def foo(self, x, y=None):
        if y is None:
            y = self.defval
    

    这也是 Python 中具有可变默认值(例如字典)是危险陷阱的原因;如果您更改了默认给出的值,那么您也将更改未来调用中的默认值。

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 2019-06-15
      • 2022-08-13
      • 1970-01-01
      • 2016-08-15
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多