用于在python中组织层次结构类的文件结构

时间:2013-07-09 14:48:02

标签: python class inheritance module code-organization

我正在尝试在python中组织一些层次类,着眼于在其他地方重用子类 - 但仍然使用一个规范表示。我理解这是子类和继承的一部分,但我在实际的文件和目录组织中被绊倒了。

这是我的情况。我想定义三个实体:

  1. 组织
  2. 地址
  3. 人员和组织都可以拥有地址,但地址始终相同,无论他们属于人员还是组织。因此,我希望相同的验证逻辑(例如,“是一个有效的邮政编码吗?”)位于存储在我的项目中的单个位置的单个Address类中,以及人员和组织从该类中抽取。也就是说,人员和组织包含地址。

    我想我会从JSON文档中实例化它们。

    @ensure("zip", is_valid_zip)
    class Address:
       def __init__(self,s):
          self.street = s.get('street')
          self.city = s.get('city')
          self.state = s.get('state')
          self.zip = s.get('zip')
    
    >>> addr = Address({"street":"123 main st", "city": "Kalamazoo", "state": "MI","zip":"49001"})
    

    现在,当我创建一个人时,我想要包含该地址。如果这个人看起来像这样,并且创建它的字符串如下所示:

    class Person:
       def __init__(self,s):
          self.fname = s.get('fname')
          self.lname = s.get('lname')
          self.address = Address(s.get('address'))
    >>> bill = Person({'fname': "Billbert", "lname": "Bronson", "address": {"street":"123 main st", "city": "Kalamazoo", "state": "MI","zip":"49001"}})
    
    >>> bill.address.street
    >>> '123 main st'
    

    ......我应该在哪里存储这些模块,以及如何存储?在我的项目中导入的正确位置在哪里?我有类似的东西......

    schemas
    ├── schemas
    │   ├── __init__.py
    │   ├── people.py
    │   ├── addresses.py
    │   └── organizations.py
    ├── README.md
    └── setup.py
    

    __init__.py包含:

    from schemas.addresses import Address
    from schemas.people import Person
    from schemas.organizations import Organization
    

    但这里有一些循环。 Person类本身是否需要Address中的import语句?

    现在在我的新剧本中,我希望能够说......

     >>> from schemas import Person
     >>> bill = Person({'fname': "Billbert", "lname": "Bronson", "address": {"street":"123 main st", "city": "Kalamazoo", "state": "MI","zip":"49001"}})
    

    在其他问题中,当我尝试这种方法时,我收到错误

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/stuff/schemas/schemas/people.py", line 5, in __init__
        self.address = Address(s.get('address'))
    NameError: global name 'Address' is not defined
    

    ...这让我担心我完全咆哮了错误的继承树。

    任何有关如何做到这一点/正确/的提示都会受到高度赞赏 - 甚至诸如“这里是从JSON加载的替代方案”或“做一个花哨的抽象类工厂疯狂的东西就像这样”。

1 个答案:

答案 0 :(得分:0)

一旦我的import语句正确,这实际上工作正常。 (是的,我确实必须在每个中导入子类,并且它工作正常。)我接受这个作为答案,但如果有人有更好的建议,欢迎你发帖。

相关问题