Python类结构
我正在努力使我的新代码尽可能对用户友好,对于我面临的特定问题,我的想法是: 假设我们有Python类结构,python,Python,我正在努力使我的新代码尽可能对用户友好,对于我面临的特定问题,我的想法是: 假设我们有 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):
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
或
我知道可以将方法C编写为函数,并按如下方式执行:
final_result = method_c(foo.method_a)
final_result = method_c(foo.method_b)
但是我认为如果我能像上面所说的那样应用方法C,代码会更容易阅读
这有可能吗
谢谢您的陈述不太清楚,让我们假设您想将方法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
然后,您可以按自己的喜好将链条连接到任意长度:
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
如果类不是您计划放置的,那么您可以放置不同的类。在Hustmphrr的评论之后,我像这样更改了代码 (在这里,我只是假设方法C只是将1添加到结果中):
我不知道你为什么要买房子。您的代码似乎只需要一个简单的方法。属性用于获取和设置要管理的数据
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)
属性通常用作包装器方法来控制数据。您想做什么?如果您试图处理
均值
和中值
的结果,为什么不在返回之前先将其包装?均值和中值计算实际上只是我自己实现的更复杂函数的占位符。方法A进行一些计算;方法B也是,但有点不同。结果的类型总是相同的。不知道如何包装函数才能得到我想要的。你能想到一个简单的例子吗?你是否想调用< <代码> >或<代码>方法> b/COD>而不调用结果>代码>方法>代码>?现在考虑,<代码>方法> A <代码> >代码>方法B >代码>返回一个简单的数字,而<代码>方法> C >代码>将把这个数字作为参数。您提议的更改将意味着创建一个全新的类,或者将状态添加到TestClass
,只是为了启用调用链接。您将为该方法的实现增加复杂性,因为调用的可读性的增加是一个非常有争议的问题。就我个人而言,我更喜欢在适当的时候使用参数和返回值而不是对象状态。API表面的规则有点不同,但要使API友好,理想情况下只需公开一个method.Humm。我没有在代码中直接实现您的想法,但是,我不知道可以在另一个类中封装返回值。