我正在尝试在 python 中组织一些分层类,着眼于在其他地方重用子类——但仍然使用一个规范表示。我知道这是子类化和继承的一部分,但是我在实际的文件和目录组织中遇到了很多问题。
这是我的情况。我想定义三个实体:
- 人们
- 组织
- 地址
人和组织都可以有地址,但地址总是相同的,无论它们属于个人还是组织。因此,我希望将相同的验证逻辑(例如,“这是一个有效的邮政编码吗?”)放在存储在我项目中一个位置的单个地址类中,并让人员和组织从该类中提取. 也就是说,人员和组织包含地址。
我想我将从 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 加载的替代方法”或“像这样做一个花哨的抽象类工厂疯狂的事情”之类的事情。