SQLAlchemy declarative_base와 비슷한 스키마 클래스를 만들려고합니다. 스키마 클래스는 상속을 사용하여 확장 가능해야합니다. 지금까지 내 시도입니다. 속성 (클래스 변수)이 사전 순으로 정렬되는 것을 제외하고는 잘 동작합니다.순서를 유지하면서 클래스 변수를 수집하는 방법
import inspect
class BaseProp(object):
def __init__(self, name):
self.name = name
class StringProp(BaseProp): pass
class EmailProp(BaseProp): pass
class BaseSchema(object):
@classmethod
def _collect_props(cls):
prop_filter = lambda a:not(inspect.isroutine(a)) and issubclass(a.__class__, BaseProp)
return inspect.getmembers(cls, prop_filter)
@classmethod
def as_list(cls):
return cls._collect_props()
@classmethod
def as_dict(cls):
return dict(cls._collect_props())
class UserIdentSchema(BaseSchema):
email = EmailProp('email')
password = StringProp('password')
class UserProfileSchema(UserIdentSchema):
name = StringProp('name')
phone = StringProp('phone')
from pprint import pprint
pprint(UserProfileSchema.as_list())
결과는 다음과 같습니다. 속성이 사전 순으로 정렬됩니다.
[('email', <__main__.EmailProp object at 0x10518a950>),
('name', <__main__.StringProp object at 0x10517d910>),
('password', <__main__.StringProp object at 0x10517d8d0>),
('phone', <__main__.StringProp object at 0x10517d950>)]
하위 스키마의 최상위에 기본 스키마 소품을 갖고 싶습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까? 나는 AST를 통과해야만합니까 ...?
편집 : 클래스 내에서 속성 순서를 유지해야합니다.
AST를 수행 할 필요는 없지만 직접 클래스 계층 구조를 살펴야합니다. – BrenBarn
@BrenBarn -'email'과'password'가 어떻게 정렬되는지 신경 쓰면, AST가 BaseSchema 메타 클래스 ('type')에 전달되기 때문에 AST를 볼 필요가 있습니다. – mgilson
참고, 했어요. [이 답변] (http://stackoverflow.com/a/20381633/748858)과 비슷한 것입니다. 가장 큰 차이점은 대답은 상속을 다루지 않았지만 여기서 중요하다는 것입니다. 그래도 상속을 다루기 위해 이전 대답을 확장하는 것은 그리 어렵지 않을 것입니다 ... – mgilson