python - 将未定义的方法调用传递给包含不同对象的属性

标签 python class oop delegates pandas

我有一个类,其属性将是 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()

输出[2]:空DataFrame()

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

谢谢,

圆周率

最佳答案

您需要覆盖 A 类的 __getattr__ 方法和 delegate所有对 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'

关于python - 将未定义的方法调用传递给包含不同对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21610363/

相关文章:

javascript - babel flask jinja javascript hell

python - 如何使用python写入特定位置的文件?

python - 模块未找到错误 : No module named 'keras' for Jupyter Notebook

java - 需要帮助将对象传递给其他类(记分牌、bukkit)

python - 在python中的同一个类的定义中创建一个类的实例

java - 这是将 Java 接口(interface)转换为 Scala 的正确方法吗?

python - Tox 为缺失的环境变量设置默认值

PHP PDO MySQL count() 预处理语句

java - 我在使用 instanceof "wrong"吗?

html - 为什么我的标志没有显示?