以下代码是我正在使用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个变量,如果我以这种方式实现我的想法,那么我&#39 ; m最终会得到很多代码如下:
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对象作为输入而不是一堆标量变量,但我宁愿不这样做。实际上,这只会将语法功能推到条形函数中,我想我的代码看起来像这样:
def bar(f):
return f.a+f.b+f.c
有没有更好的方法来处理这个?我的理解是没有" self。",我会引用类变量而不是实例变量。我想过使用一本字典,但这似乎更加残酷,包括所有[" a"]的东西。可能会有一些自动化的方式来获取字典,例如" a"," b"," c",...以及将值卸载到局部变量名为a,b,c等等?
答案 0 :(得分:2)
嗯,如果你真的想要的话,可以这样做,但我会反对它。如果您在班级中添加字段等,该怎么办?它也让事情变得更复杂。
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())
答案 1 :(得分:2)
您可以使用__dict__
从不同长度的数据创建属性,然后使用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
答案 2 :(得分:2)
我认为你这是错误的做法。你的例子很难读,你是对的,但我认为根本原因不是Python的语法。包含10-15个变量的参数列表在任何编程语言中都难以阅读。我认为问题在于你的程序结构。不要试图找到解决Python语法和约定的方法,而是考虑重构程序,这样你的类就不需要那么多的属性,或者重构你的方法,所以它们不需要返回那么多的属性。
不幸的是,如果没有看到代码的完整版本,我无法帮助您做到这一点,但Code Review Stack Exchange将是一个获得一些帮助的好地方。减少返回的值和没有提出列出和操作属性的非常规方法将使您的代码更易于阅读和维护,无论是对他人还是将来。