Python 减少方法访问实例变量时的语法错误?

Python 减少方法访问实例变量时的语法错误?,python,oop,Python,Oop,下面的代码是我正在使用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()) 在上面的示例代码中

下面的代码是我正在使用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)
  def bar(f):
    return f.a+f.b+f.c
哇,能用这样的风格来写这篇文章真是太好了:

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)
  def bar(f):
    return f.a+f.b+f.c
这将更加简洁易懂。实现这一点的一种方法可能是重写bar,以便它将一个Foo对象作为输入,而不是一堆标量变量,但我不希望这样做。实际上,这只会将语法上的错误向下推到bar函数中,我想我的代码如下所示:

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)
  def bar(f):
    return f.a+f.b+f.c
有没有更好的方法来处理这个问题?我的理解是,如果没有“self”,我将引用类变量而不是实例变量。我曾想过使用字典,但这似乎更粗糙,因为有了所有的[“a”]东西。是否有一些自动的方法来获取带有“a”、“b”、“c”等键的字典,。。。然后将值卸载到名为a、b、c等的局部变量中?

如果你真的想这样做,你可以这样做,但我建议不要这样做。如果在类中添加一个字段等等,会怎么样?而且这只会让事情变得更复杂

class Foo:
  def __init__(self):
    self.x = 1
    self.y = 1
    self.z = 1
  def method(self):
    return bar(**vars(self))  # expand all attributes as arguments

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

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

您可以使用
\uuuu dict\uuuu
从不同长度的数据创建属性,然后使用
classmethod
对传递的属性求和:

import string
class Foo:
  def __init__(self, data):
    self.__dict__ = dict(zip(string.ascii_lowercase, data))
  @classmethod
  def bar(cls, instance, vals = []):
    return sum(instance.__dict__.values()) if not vals else sum(getattr(instance, i) for i in vals)

f = Foo(range(20))
print(Foo.bar(f))
print(Foo.bar(f, ['a', 'c', 'e', 'k', 'm']))
输出:

190
28

我认为你走错了方向。您的示例很难阅读,这是正确的,但我认为根本原因不是Python的语法。包含10-15个变量的参数列表在任何编程语言中都很难读取。我认为问题在于你的程序结构。不要试图绕过Python的语法和约定,考虑尝试重构你的程序,这样你的类不需要那么多的属性,或者重构你的方法,这样他们就不需要返回这么多的属性。
不幸的是,在没有看到完整版本的代码之前,我无法帮助您做到这一点,但这将是一个获得帮助的好地方。减少返回值的数量,不使用非常规的方法列出和操作属性,这将使您的代码更易于阅读和维护,无论是对他人还是您自己都是如此。

如果没有self,您将引用全局变量,非类变量。不要使用
dir
使用
vars
并放弃
prop
辅助函数。。。。为什么要使用传递实例的classmethod而忽略类参数?