繁体   English   中英

self 未在类方法参数中定义

[英]self is not defined in class method argument

我有 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 个参数(每个方法都没有,而是所有类的所有方法的摘要),使用这种方法,我会得到大约100 行新代码,这在我看来非常“脏” “解决方法......没有更简单的方法来达到那个目标吗?

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

选项1

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

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

选项 2

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

谢谢大家,感谢您的评论和回答,我找到了一个完整的解决方案。

>>> 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 存储原始信息,并在函数开头刷新类变量。 如果某些东西在 kwargs 中,它只会覆盖它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM