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。我没有在代码中直接实现您的想法,但是,我不知道可以在另一个类中封装返回值。