我试图从初始化为列表的类中调用类方法时返回一个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循环应在类方法内完成。
答案 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?