我有一个表格类:
class MyClass(object):
def curves(self):
def plot(self):
plot a graph
return something
return a pd.DataFrame
我想要做的是定义我可以使用instance_of_my_class.curves.plot()
我是否需要将曲线定义为对象以使其成为可能?我正在寻找最短的方法,因为这只是语法糖。
感谢。
答案 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;
});