2

我正在尝试在 python 中组织一些分层类,着眼于在其他地方重用子类——但仍然使用一个规范表示。我知道这是子类化和继承的一部分,但是我在实际的文件和目录组织中遇到了很多问题。

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

  1. 人们
  2. 组织
  3. 地址

人和组织都可以有地址,但地址总是相同的,无论它们属于个人还是组织。因此,我希望将相同的验证逻辑(例如,“这是一个有效的邮政编码吗?”)放在存储在我项目中一个位置的单个地址类中,并让人员和组织从该类中提取. 也就是说,人员和组织包含地址。

我想我将从 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 加载的替代方法”或“像这样做一个花哨的抽象类工厂疯狂的事情”之类的事情。

4

1 回答 1

0

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

于 2013-07-22T18:05:49.187 回答