例如:
class person():
def __init__(self):
self.a1 = 0
self.a2 = 0
self.a3 = 0
def method_a1(self):
self.a1 = self.a1 * 2
print(self.a1)
def method_a2(self):
self.a2 = self.a2 * 2
print(self.a2)
def method_a3(self):
self.a3 = self.a3 * 2
print(self.a3)
这三种方法是相似的,所以我想构建一个函数来生成这些方法,如下所示:
class person():
def __init__(self):
self.a1 = 0
self.a2 = 0
self.a3 = 0
def method(p):
p = p * 2
print(p)
method(self.a1)
method(self.a2)
method(self.a3)
我不知道如何写它。
答案 0 :(得分:2)
你可以沿着以下几点做:
def _helper(attr):
def method(self):
val = getattr(self, attr) * 2
setattr(self, attr, val)
print(val)
return method
class person():
# ...
method_a1 = _helper('a1')
method_a2 = _helper('a2')
method_a3 = _helper('a3')
答案 1 :(得分:1)
您可以直接在__init__
中分配它们,并使用一些通用函数通过带有getattr()
和setattr()
的字符串检索属性,并返回要调用的函数:
class person():
def __init__(self):
self.a1 = 0
self.a2 = 0
self.a3 = 0
self.method_a1 = self._generic_update('a1')
self.method_a2 = self._generic_update('a2')
self.method_a3 = self._generic_update('a3')
def _generic_update(self, attribute):
def update():
value = getattr(self, attribute)
setattr(self, attribute, value * 2)
print(getattr(self, attribute)
return update
答案 2 :(得分:0)
你可以用Python做一些奇怪的事情。
我想到的是使用getattr(从表示其名称的字符串中获取属性)和setattr(使用其名称编写属性)
检查出来:
class Person(object):
def __init__(self):
self.a1 = 0
self.a2 = 1
self.a3 = 2
def method(self, attr_name):
new_value = getattr(self, attr_name) * 2
setattr(self, attr_name, new_value)
print(getattr(self, attr_name))
if __name__ == "__main__":
pers = Person()
pers.method('a1')
pers.method('a2')
pers.method('a3')
输出:
0
2
4
但是:您还应该考虑可读性:有时候写一点可以让其他阅读代码的人更好地理解它。滥用这样的东西可能会使代码非常混乱。