每个文件一个类在python中导致双重名称

时间:2014-11-11 14:53:18

标签: python

所以我在Python中有一个我自己的小项目,我想经常使用它。目前,它由两个类组成,我们称之为类AclassBclass

两个类合并的代码量很大。如此之大,以至于我不想拥有将它们放在一个文件中,所以我为每个文件创建了一个文件。我将第一个放入文件aclass.py,第二个放入bclass.py,所以我的结构现在看起来像这样:

my_project/
  aclass.py
  bclass.py
  __init__.py

我想要的是能够从python调用我的项目并准备好类,如下所示:

import my_project
a_instance = my_project.Aclass()
b_instance = my_project.Bclass()

目前,我要做的是

import my_project
a_instance = my_project.aclass.Aclass()

如果你问我,这是多余的。在问题中:

Avoid double typing class names in python

我看到了建议

from aclass import Aclass
from bclass import Bclass

进入__init__.py文件,但这会导致混淆,因为如果我这样做,我可以通过编写

来创建我的类的实例
import my_project
a_instance = my_project.Aclass()

或写作

import my_project
a_instance = my_project.aclass.Aclass()

我觉得这个解决方案很丑陋,因为它不仅会“复用”函数(同时创建aclass.Aclass()Aclass(),而且还意味着Aclass类的任何实例现在都是Python的眼睛,

<class my_project.aclass.Aclass at ******************>

而不是

<class my_project.Aclass at ******************>

它在自然项目结构中。

因此,我的问题是:

我的问题是否有解决方案,Aclass将直接放在my_project包中而不将该类写入__init__文件?

1 个答案:

答案 0 :(得分:3)

;你只有两个选择:

  1. 将所有内容放在一个文件中,并且每个对象只有一条路由,代价是笨重的代码库;或
  2. 拥有多个文件并使用__init__.py来定义库顶层的可用内容,并接受这意味着指向对象的多条路径。
  3. 对于超出少数几个类别和职能的任何项目,后者显然更可取;它被广泛用于标准库及其他领域。例如,对于the json library__init__.py包含from .decoder import JSONDecoder

    >>> import json
    >>> json.JSONDecoder
    <class 'json.decoder.JSONDecoder'>
    >>> json.JSONDecoder is json.decoder.JSONDecoder
    True
    

    在绝大多数情况下,您的代码的任何用户都将使用较短的名称而不是较长的名称,但是,当它们指向同一个对象时,如果它们不是真的重要混合搭配,你很少有机会看到“Python认为”完全合格的班级名称。