【问题标题】:self is not defined in class method argumentself 未在类方法参数中定义
【发布时间】:2019-01-14 05:39:29
【问题描述】:

我有 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 个参数(每个方法中没有,而是所有类的所有方法的摘要),使用这种方法,我会得到大约 一百行新代码 在我看来,这似乎是非常“肮脏” 的解决方法...没有更简单的方法来实现它吗?

【问题讨论】:

  • 你能解释一下你想用你的方法做什么吗?你的例子有点奇怪......
  • 好吧,你可以使用条件表达式:fruit = self.banana if fruit is None else fruit。这样你的台词就减半了。我会使用完整的声明。
  • 确定你需要一个有 50(!) 个参数的方法吗?

标签: python python-3.x function class


【解决方案1】:

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

选项 1

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

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

选项 2

考虑修改代码的结构。例如,可能不需要让每个方法中使用的fruit 在调用时发生变化,而只需使用预设选项,如self.banana。 (基本上只需完全删除关键字参数fruit,然后继续使用self.banana。)对于那些在调用方法时确实需要改变的人,然后求助于选项1。

【讨论】:

  • 选项 2 是更好的方法。如果你有 50 个参数,你可以相应地使用 *args 或 **kwargs
【解决方案2】:

谢谢大家,感谢你们的 cmets 和答案,我找到了一个完整的解决方案。

>>> 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'

但这对我来说根本不是问题。如果有人想知道如何使这些更改只是暂时的,请将原始初始化值保存到 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 存储原始信息,并在函数开头刷新类变量。如果某些东西在 kwargs 中,它只会覆盖它。

【讨论】:

    【解决方案3】:

    最好的选择是为它制作单独的 Mutator

    def setFruit(self, fruit):
        self.fruit = fruit
    

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多