如何构建方法生成器来创建类似的类方法

时间:2018-01-04 07:41:39

标签: python class

例如:

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)

我不知道如何写它。

3 个答案:

答案 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

但是:您还应该考虑可读性:有时候写一点可以让其他阅读代码的人更好地理解它。滥用这样的东西可能会使代码非常混乱。