Python类结构

时间:2015-03-21 14:07:50

标签: 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):
        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,这将使代码更容易阅读。

这有可能吗?

感谢

3 个答案:

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

该属性通常用作控制数据的包装器方法。