[英]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.