在熊猫中,我们可以直接执行以下操作
import pandas as pd
df = pd.DataFrame()
在这里,pandas是一个包装。 DataFrame是一个类。因此,这是如何工作的,因为DataFrame实际上是在pandas.core.frame
中定义的(它是在pandas核心文件夹内的frame.py中定义的)。
注意:我当时认为可以通过在__init__.py
文件中执行某些操作来实现这种行为。谁能帮我理解这一点。
答案 0 :(得分:4)
__init__.py
从技术上来说只是另一个python模块,因此可以直接从包本身访问包__init__.py
中定义的任何名称。在Python中,使用包的__init__.py
作为a facade for submodules / subpackages的确是一种常见的模式。
FWIW注意,熊猫的__init__.py
虽然使用__init__.py
作为正面,但是并没有遵循良好的做法,因为它使用了“星号导入”(from submodule import *
),因此跟踪名称的起源(定义模块的模块)非常痛苦-特别是对于像Panda这样的大软件包-和也非常脆弱,因为如果两个子模块导出的名称相同,则导入的名称最后将阴影第一个。优良作法是始终明确指定要导入的名称:
from submodule1 import foo, bar
from submodule2 import baaz, quux
可以清楚地知道名称的来源,并使重复的名称更加明显:
from submodule1 import foo, bar
from submodule2 import baaz, quux
from submodule3 import foo # oops, we will have to rename either this one or submodule1.foo
答案 1 :(得分:2)
Dataframe
是您在pandas/core/frame.py中定义的。
让我们看看github上的熊猫pandas/__init__.py中的directory。
第42行:
from pandas.core.api import *
第23行中的pandas/core/api.py从pandas/core/frame.py导入Dataframe
:
from pandas.core.frame import DataFrame
因此,由于您从import *
中的pandas/core/api.py
pandas/__init__.py
到pandas/core/api.py
导入了Dataframe
,所以Dataframe
被直接导入了熊猫。