我正在努力使我的新代码尽可能方便用户使用,我想要解决的特殊问题是:
假设我们有
import numpy as np
class TestClass:
def __init__(self, data):
self.data = data
@property
def method_a(self):
return np.median(self.data)
@property
def method_b(self):
return np.mean(self.data)
foo = TestClass([1, 2, 5, 7, 12, 6, 3, 37, 16])
print(foo.method_a)
print(foo.method_b)
到目前为止,一切都很好。方法A给出中位数,方法B给出中位数。
在处理过程中,我会根据两种方法之间的情况进行切换。所以有时我会称方法A,有时方法B. 但是,我想要的是继续使用方法C,它以这种方式对方法A或B的结果起作用
final_result = foo.method_a.method_c
或
final_result = foo.method_b.method_c
我知道可以将方法C编写为函数,并按照以下方式执行:
final_result = method_c(foo.method_a)
final_result = method_c(foo.method_b)
但我认为如果我可以按上述方法应用方法C,这将使代码更容易阅读。
这有可能吗?
感谢
答案 0 :(得分:2)
您的陈述不太清楚,我们假设您要将方法C添加到类中。你可以将你的返回值再次包装在类中,以达到你想要的效果:
import numpy as np
class TestClass:
def __init__(self, _data):
self._data = data
@property
def data(self): return self._data
@property
def method_a(self):
return TestClass(np.median(self.data))
@property
def method_b(self):
return TestClass(np.mean(self.data))
@property
def method_c(self):
return TestClass(np.whatever(self.data))
然后你可以连接多久你想要的东西:
final_result = foo.method_a.method_b.method_c.method_c.data
如果课程不是你打算安排的课程,你可以选择不同的课程。
答案 1 :(得分:0)
根据HuStmpHrrr的评论我改变了我的代码 (这里我假设方法C只是将结果加1):
import numpy as np
class NewClass:
def __init__(self, data):
self.data = data
def method_c(self):
return self.data + 1
class TestClass:
def __init__(self, data):
self.data = data
@property
def method_a(self):
return NewClass(np.median(self.data))
@property
def method_b(self):
return NewClass(np.mean(self.data))
foo = TestClass([1, 2, 5, 7, 12, 6, 3, 37, 16])
result1 = foo.method_a
result2 = foo.method_b
print(result1.method_c())
print(result2.method_c())
答案 2 :(得分:0)
我不确定你为什么想要一个房产。您的代码似乎真的只需要一个简单的方法。属性适用于您要获取和设置要管理的数据。
class Test(Object):
def __init__(self, data):
super().__init__()
self.data = data
self.value = 0
# end Constructor
def method_a(self):
return np.median(self.data)
# end method_a
@property
def method_c(self):
return self.value
@method_c.setter
def method_c(self, value):
self.value = value
# self.method_a(value)
# end method_c
# end class Test
t = Test([1,2,3,4])
print(t.method_a())
t.method_c = 5 # This calls the method_c.setter and will make t.value = 5
print(t.method_c)
该属性通常用作控制数据的包装器方法。