当前位置: 首页 > 面试题库 >

将类变量作为默认值分配给类方法参数

吕新
2023-03-14
问题内容

我想在一个类中构建一个方法,并从该类中获取默认值参数。通常,我会对某些数据进行过滤。在我的班级内部,我有一个方法,通常我会传递数据向量。有时我没有矢量,而是获取了模拟html" target="_blank">数据。每次我不传递特定向量时,我都希望默认情况下获取模拟数据。我认为在我说的方法定义中应该很容易构造a=self.vector。但是由于某种原因,我有一个错误NameError: name 'self' is not defined。简化的结构是:

class baseClass(object):  # This class takes an initial data or simulation
    def __init__(self):
        self.x = 1
        self.y = 2

class extendedClass(baseClass): # This class does some filtering
    def __init__(self):
        baseClass.__init__(self)
        self.z = 5
    def doSomething(self, a=self.z):
        self.z = 3
        self.b = a

if __name__ == '__main__':
    a = extendedClass()
    print a.__dict__
    a.doSomething()
    print a.__dict__

我期望的输出应该是:

{'y': 2, 'x': 1, 'z': 5}
{'y': 2, 'x': 1, 'z': 3, 'b': 5}

我尝试了默认分配,因为def doSomething(self, a=z):它显然无法正常工作。据我了解self.z,该范围是可见的,将其作为默认值应该不是问题。不知道为什么会有这个错误以及如何解决。这可能是一个简单的问题,但我试图弄清楚它或找到解决方案已经有一段时间了。


问题答案:

您的理解是错误的。self本身就是该函数定义的参数,因此在那时它不可能在范围内。它仅在函数本身的范围内。

答案很简单,就是将参数默认为None,然后在方法中检查该参数:

def doSomething(self, a=None):
    if a is None:
        a = self.z
    self.z = 3
    self.b = a


 类似资料:
  • 问题内容: 浏览Java API源代码时,我经常看到方法参数已重新分配给局部变量。为什么要这样做? 这在java.util.HashMap中 问题答案: 这是线程安全性/更好性能的规则。在易失。如果将变量分配给局部变量,它将变为局部堆栈变量,该变量自动是线程安全的。而且,修改局部堆栈变量不会强制“先发生”,因此在使用它时不会产生同步损失(与之不同的是,每次读/写操作都会导致易失性,这会花费您获取/

  • 从性能还是从其他因素来看,哪一种方法更好? 假设我正在创建一个类,其中有一个方法,它接受2个值并将它们相加在一起。 是有两个实例变量来存储两个值,然后有一个方法来使用这些值更好,还是在调用方法时将变量作为参数传入更好? 或者仅仅使用静态方法更好,这样我就不需要在每次使用该方法时创建对象了?

  • 当用Katalon Studio定义测试用例变量时,我如何将他的默认值设置为全局变量值?

  • 你好,我在小部件上的以下代码中出错 参数类型'List 这是我的代码 我的代码与上面的图表插件不兼容吗?如何解决这个问题?

  • 如果未在 Go 中设置环境变量,如何分配默认值? 在Python中,我可以做其中是默认值,如果env var未设置。 我尝试了基于 os 的 if 语句 是空的,但由于 if 语句中的变量赋值范围,这似乎不起作用。而且我正在检查多个 env var,所以我无法在 if 语句中对这些信息采取行动。