【问题标题】:pass an undefined method call to an attribute containing a different object将未定义的方法调用传递给包含不同对象的属性
【发布时间】:2014-03-03 20:07:39
【问题描述】:

我有一个属性是 pandas DataFrame() 的类。我想设置这个类,这样如果在其上调用任何 DataFrame() 方法,该方法将应用于 DataFrame()。

我已经设置了这个场景:

import pandas as pd
class A(object):
    def __init__(self):
        self.df = pd.DataFrame()
        self.name = 'Charlie'

    def get_name(self):
        return self.name

    def head(n=5):
        return self.df.head(n)

所以我可以这样做:

a = A()
a.get_name()

输出[1]:“查理”

a.head()

Out[2]: 空 DataFrame()

我不想重新定义要传递的类的每个方法。这只是一个例子。我想在其他地方应用它。

谢谢,

圆周率

【问题讨论】:

    标签: python class oop delegates pandas


    【解决方案1】:

    您需要覆盖Adelegate 类的__getattr__ 方法所有对self.df 的调用,如果在self.df 中找不到该属性,则在当前对象中查找它。我的系统上没有 Pandas,所以我将为演示定义另一个类:

    class B(object):
    
        def func(self):
            print 'Inside B'
    
    class A(object):
    
        def __init__(self):
            self.df = B()
            self.name = 'Charlie'
    
        def get_name(self):
            return self.name
    
        def __getattr__(self, attr):
            try:
                return getattr(self.df, attr)
            except AttributeError:
                #If attribute was not found in self.df, then try in self
                return object.__getattr__(self, attr)
    

    输出:

    >>> a = A()
    >>> a.func()
    Inside B
    >>> a.get_name()
    'Charlie'
    

    【讨论】:

    • 谢谢阿什维尼!成功了。
    • @NauticalMile 内置类所有新式类都继承自。
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2017-06-21
    • 2011-06-30
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多