类方法返回列表/数组

时间:2019-08-15 08:44:40

标签: python arrays numpy

我试图从初始化为列表的类中调用类方法时返回一个numpy数组。

import numpy as np

class test_object:

    def __init__(self, val=1):
        self.value = val

    @staticmethod
    def generate(number=5):

        # create list of test_objects
        obj = [test_object(val=i) for i in range(number)]

        return obj

    def powers(self, pow=2):
        return self.value**pow


numbers = test_object.generate(number=10)

array = np.zeros(len(numbers))

for i in range(len(numbers)):
    array[i] = numbers[i].powers()

print(array)

是否可以修改类/类方法的“功能”,以便 像这样工作:

array = numbers.powers()

数组初始化和for循环应在类方法内完成。

2 个答案:

答案 0 :(得分:1)

这是一个解决方案:

import numpy as np

class test_object():
    def __init__(self, val=1):
        self.value = val

    class test_object_list(list):
        def powers(self):
            return np.asarray([i.powers() for i in self], dtype=float)

    @classmethod
    def generate(cls, number=5):
        # create list of test_objects
        obj = cls.test_object_list([cls(val=i) for i in range(number)])
        return obj

    def powers(self, pow=2):
        return self.value**pow


numbers = test_object.generate(number=10)
array = numbers.powers()
print(array)

请注意,我已将@staticmethod替换为@classmethod,因为它更合适。

答案 1 :(得分:0)

我相信您需要扩展列表功能。

可能的解决方法如下:

# Extended subclass
class mylist(list):
    def power(self, pow=2):
        if self:
            return[i.value**pow for i in self]


class test_object:

    def __init__(self, val=1):
        self.value = val

    @staticmethod
    def generate(number=5):
        # create list of test_objects
        obj = [test_object(val=i) for i in range(number)]
        obj=mylist(obj)
        return obj

    def powers(self, pow=2):
        return self.value**pow



numbers = test_object.generate(number=10)
print(numbers.power())

[0,1,4,9,16,25,36,49,64,81]

此答案也基于另一篇文章: Can I add custom methods/attributes to built-in Python types?