我正在尝试在python中组织一些层次类,着眼于在其他地方重用子类 - 但仍然使用一个规范表示。我理解这是子类和继承的一部分,但我在实际的文件和目录组织中被绊倒了。
这是我的情况。我想定义三个实体:
人员和组织都可以拥有地址,但地址始终相同,无论他们属于人员还是组织。因此,我希望相同的验证逻辑(例如,“是一个有效的邮政编码吗?”)位于存储在我的项目中的单个位置的单个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加载的替代方案”或“做一个花哨的抽象类工厂疯狂的东西就像这样”。
答案 0 :(得分:0)
一旦我的import语句正确,这实际上工作正常。 (是的,我确实必须在每个中导入子类,并且它工作正常。)我接受这个作为答案,但如果有人有更好的建议,欢迎你发帖。