没有对象衰减的子功能参考

时间:2016-07-29 08:02:22

标签: python

我有一个表格类:

class MyClass(object):
  def curves(self):
    def plot(self):
       plot a graph
       return something
    return a pd.DataFrame

我想要做的是定义我可以使用instance_of_my_class.curves.plot()

调用的内容

我是否需要将曲线定义为对象以使其成为可能?我正在寻找最短的方法,因为这只是语法糖。

感谢。

1 个答案:

答案 0 :(得分:0)

为了添加层次结构,curves需要是一个实际的对象,是的。 foo.curves.plot()和以下内容之间没有区别:

c = foo.curves
c.plot()

因此foo.curves必须是具有plot方法的对象。

此外,由于在curves对象上调用该方法,该方法将绑定到该对象。因此,除非您以这种方式进行设置,否则curves对象将无法访问您的实际类。

您可以在curves构造函数中传递实例:

class Curves (object):
    def __init__ (self, parent):
        self.parent = parent
    def plot (self):
        self.parent._plot()

class MyClass (object):
    def __init__ (self):
        self.curves = Curves(self)
    def _plot (self):
        print('Actual plot implementation')

然后您可以将其用作foo.curves.plot()

>>> foo = MyClass()
>>> foo.curves.plot()
Actual plot implementation

您还可以使用curves class Accessor (object): def __init__ (self, prefix = ''): self.prefix = prefix def __get__ (self, instance, owner): return AccessorDelegate(instance, self.prefix) class AccessorDelegate (object): def __init__ (self, instance, prefix): self.instance = instance self.prefix = prefix def __getattr__ (self, name): return getattr(self.instance, self.prefix + name) 来自动执行此操作。例如,这是一种可能的解决方案:

class MyClass (object):
    curves = Accessor('_curves_')

    def _curves_plot(self):
        print('Implementation of curves.plot')

显而易见的好处是,您只需要定义一次,然后它们将适用于您的所有课程。您可以在课堂上使用它:

>>> foo = MyClass()
>>> foo.curves.plot()
Implementation of curves.plot

完全如上所述:

app.get('/', function (req, res) {
    var hey = request.connection.remoteAddress;
});