Python 熊猫样式对象成员
我试图弄清楚熊猫是如何在飞行中创建新的对象成员的。例如,如果您这样做:Python 熊猫样式对象成员,python,pandas,Python,Pandas,我试图弄清楚熊猫是如何在飞行中创建新的对象成员的。例如,如果您这样做: d = {'col1': [1, 2], 'col2': [3, 4]} df = pd.DataFrame(data=d) 您可以立即执行以下操作: df.col1 并获取col1的内容。熊猫如何动态创建col1成员 谢谢。在检查字典输入的存储库中: class DataFrame(NDFrame): def __init__(self, data=None, index=None, columns=None,
d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
您可以立即执行以下操作:
df.col1
并获取col1
的内容。熊猫如何动态创建col1
成员
谢谢。在检查字典输入的存储库中:
class DataFrame(NDFrame):
def __init__(self, data=None, index=None, columns=None, dtype=None,
copy=False):
if data is None:
data = {}
# Some other if-statements that check data types...
elif isinstance(data, dict): mgr = self._init_dict(data, index, columns, dtype=dtype)
它使用:
因此,真正的工作来自pandas.core.index.base中的。从那时起,事情开始变得非常复杂(我对解释任何事情的“如何”而不继续倒退直到机器代码的理解开始消失)但是可以肯定地说,如果给pandas.Index类一个一维数据数组,它将创建一个具有可切片集和关联数据类型的对象
这正是你所观察到的——你基本上给了它一串键,
pandas
知道它需要给你一些可以作为索引访问的东西(因为df.col1
只是df['col1']
)的语法糖,你可以切片(df[0:1]
),它知道自己的数据类型 当然,在问了这个问题之后,我自己找到了答案
事实证明,您可以使用\uuu getattr\uuu
来实现这一点。最简单的方法(也是我碰巧想要的方法)是使用字典,然后使用\uuu getattr\uuu
从字典返回值,如下所示:
class test():
def __init__(self):
# super().__init__()
self.adict = {'spam' : 'eggs'}
def __getattr__(self, attr):
return self.adict[attr]
nt = test()
print(nt.spam)
当找不到类属性时,将调用\uuuuu getattr\uuuu
,如下所示。解释器找不到spam
属性,因此它将该属性推迟到\uu getattr\uu
。要记住的事情:
- 如果该键在字典中不存在,这将引发键错误,而不是属性错误
- 不要使用
,因为每次调用一个属性时都会调用它,这会弄乱整个类\uuuu getattribute\uuuu
感谢大家在这方面的投入。我们来检查回购协议怎么样?正如我所担心的,答案不是简单的Python机制。谢谢你给我指明了正确的方向!不客气:)不过,下次一定要包括为什么你想知道一些相关的事情。对包的内部机制感到好奇与想知道如何实现相同的行为是截然不同的。我相信前面提到的猜测熊猫可能会使用
\uuu getattr\uuuu
的评论,但在我发布我的答案后,他们删除了它。
class test():
def __init__(self):
# super().__init__()
self.adict = {'spam' : 'eggs'}
def __getattr__(self, attr):
return self.adict[attr]
nt = test()
print(nt.spam)