私は、サブクラスを他の場所で再利用することを目的として、python でいくつかの階層クラスを整理しようとしていますが、それでも 1 つの正規表現を使用しています。これがサブクラス化と継承の目的の一部であることは理解していますが、実際のファイルとディレクトリの編成でつまずいてしまいます。
これが私のケースです。3 つのエンティティを定義したいと思います。
- 人々
- 組織
- 住所
個人と組織の両方がアドレスを持つことができますが、個人または組織に属しているかどうかにかかわらず、アドレスは常に同じです。したがって、同じ検証ロジック (たとえば、「それは有効な郵便番号ですか?」) をプロジェクト内の 1 つの場所に格納された単一の Address クラスに配置し、People と Organizations がそのクラスから取得できるようにしたいと考えています。 . つまり、個人と組織にはアドレスが含まれています。
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 からロードする代わりの方法をここに示します」や「空想的な抽象クラス ファクトリのようなクレイジーなことを実行する」などです。