首页 > 解决方案 > 当方法访问实例变量时减少语法错误?

问题描述

以下代码是我正在使用 Python 处理的一项任务的简化示例,它似乎很适合 OOP 风格:

class Foo:
  def __init__(self):
    self.x = 1
    self.y = 1
    self.z = 1
  def method(self):
    return bar(self.x,self.y,self.z)

def bar(x,y,z):
  return x+y+z

f = Foo()
print(f.method())

在上面的示例代码中,我的对象中有三个实例变量,但在我的实际应用程序中,它更像是 10 或 15 个变量,如果我以这种风格实现我的想法,那么我将结束有很多看起来像这样的代码:

return bar(self.a.self.b,self.c,self.d,self.e,self.f,self.g,self.h,self.i)

哇,如果能够以更像这样的风格来写这个肯定会很好:

return bar(a,b,c,d,e,f,g,h,i)

这将更加简洁和可读。这样做的一种方法可能是重写 bar 以便它将 Foo 对象作为输入而不是一堆标量变量,但我不希望这样做。实际上,这只会将语法错误推到 bar 函数中,我想我的代码看起来像这样:

  def bar(f):
    return f.a+f.b+f.c

有没有更好的方法来处理这个?我的理解是,如果没有“self.”,我将引用类变量而不是实例变量。我曾考虑过使用字典,但这似乎更糟糕,包含所有 ["a"] 的东西。可能有一些自动化的方法来获取带有“a”、“b”、“c”等键的字典,并将值卸载到名为 a、b、c 等的局部变量中?

标签: pythonoop

解决方案


我认为你的做法是错误的。您是正确的,您的示例难以阅读,但我认为根本原因不是 Python 的语法。包含 10-15 个变量的参数列表在任何编程语言中都难以阅读。我认为问题在于您的程序结构。与其尝试绕过 Python 的语法和约定,不如考虑尝试重构您的程序以使您的类不需要太多属性,或者重构您的方法以使它们不需要返回太多属性。

不幸的是,如果没有看到您的代码的完整版本,我无法帮助您做到这一点,但是Code Review Stack Exchange将是获得一些帮助的好地方。减少返回值的数量并且不使用非常规的方法来列出和操作您的属性,这将使您的代码更易于阅读和维护,无论是未来的他人还是您自己。


推荐阅读