代码之家  ›  专栏  ›  技术社区  ›  Jan Musil

类方法参数中未定义self

  •  2
  • Jan Musil  · 技术社区  · 6 年前

    我有4个类,每个类有几个方法。我需要这些方法使用一些类变量作为参数,例如。

    class Orange:
        def __init__(self,banana):
            self.banana = banana
    
        def apple(self,fruit=self.banana):
            return something
    

    我已经发现这不起作用,因为方法参数是在创建函数时定义的,而不是在调用函数时定义的,所以我在这里找到了一个解决方法:

    def apple(self,fruit=None):
        if fruit is None:
            fruit = self.banana
    

    但问题是,我有大约50个参数(每个方法中没有,但是所有类的所有方法都有摘要),使用这个方法,我可以了解 一百行新代码 在我看来 “肮脏” 解决方法。。。有没有更简单的方法可以达到这个目的?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Henry Woody    6 年前

    解决这个问题有两种方法。

    选择1

    使用问题陈述中显示的方法,但可能使用三元运算符修剪行数:

    def apple(self, fruit=None):
        fruit = fruit if fruit else self.banana
    

    选择2

    考虑修改代码的结构。例如,可能不需要允许 fruit 在每个方法中使用以在调用时改变,而不是仅使用预设选项,如 self.banana . (基本上只需删除关键字参数 水果 一起去用吧 自我。香蕉 相反,对于那些在调用方法时确实需要改变的方法,请使用选项1。

        2
  •  0
  •   Jan Musil    5 年前

    谢谢各位,感谢你们的评论和回答,我找到了一个完整的解决方案。

    >>> class Orange:
    ...     def __init__(self,banana="a"):
    ...         self.banana = banana
    ...     def apple(self,**kwargs):
    ...         self.__dict__.update(kwargs)
    ...         return self.banana
    ...
    >>> test = Orange()
    >>> test.apple()
    'a'
    >>> test.apple(banana="b")
    'b'
    

    如您所见,传递不同的关键字变量将完全按照我的要求更改结果。然而,唯一的缺点(但也可能是优点,这取决于观点)是,这种更改是永久的,因此如果我们再次调用该函数,它仍然会这样更改:

    >>> test.apple()
    'b'
    

    但这对我来说根本不是问题。如果有人想知道如何使这些更改仅为临时更改,请将原始init值保存到dict,然后在需要使用这些值时,使用保存这些值的变量更新类dict,如下所示:

    >>> class Orange:
    ...     def __init__(self,fruit={"banana":"a","cherry":"b"}):
    ...         self.fruit=fruit
    ...     def apple(self,**kwargs):
    ...         self.__dict__.update(self.fruit)
    ...         self.__dict__.update(kwargs)
    ...         return self.banana
    ...
    >>> test = Orange()
    >>> test.apple()
    'a'
    >>> test.apple(banana="b")
    'b'
    >>> test.apple()
    'a'
    

    Self.fruit存储原始信息,并在函数开头刷新类变量。如果有东西是用夸尔格表示的,它就会覆盖它。