2017-04-21 18 views
2

오브젝트 인스턴스 변수를 클래스 변수로 정의 할 수있는 패턴의 이름은 무엇입니까?python 선언적 속성 패턴을 호출하는 방법

일반적으로 파이썬 객체 속성은 __init__ 메소드에 정의되어 있습니다. 몇몇 라이브러리는 객체가 외부 __init__ 속성을 정의 할 수 있습니다 :

# django models 
class User(Model): 
    name = fields.StringField() 
    lastname = fields.StringField() 

# django forms 
class LoginForm(Form) 
    username = fields.StringField() 
    password = fields.PasswordField() 

# elasticsearch_dsl 
class Post(DocType): 
    title = Text() 
    created_at = Date() 
    published = Boolean() 

이 패턴의 이름은 무엇입니까?

답변

2

Django에서 Esasticsearch DSL 및 기타 많은 패키지를 사용하면 클래스 수준 변수가 인스턴스 변수 유형을 선언/부과하고 동작, 변환을 강화할 수 있습니다.

  • 선언적 스타일 클래스 API
  • 선언 클래스 정의
  • 선언 API 클래스
  • 선언 클래스의 속성 : I가이 패턴에 대해 하나의 공식 이름은 아직 일반적으로 그것이라고 생각하지 않는다
  • 같은 API가 하다며 제공

동안 현대 클래스 DSL 다른 부모 클래스, 후크 등과 같은 그녀의 컨트롤은 비슷한 이름의 인스턴스 변수를 모델링하는 클래스 변수의 사용입니다.

현대 클래스 DSL API는 일반적으로 활성 레코드 또는 데이터 맵퍼 패턴 인 model transformation에서 사용되지만 아직 제한되지 않습니다.

이러한 '마술적인'선언적 클래스 지향 API 패키지는 메타 프로그래밍이라고합니다. 파이썬에는 객체 나 클래스 변수를 선언 할 수있는 수단이 전혀 없으며 메타 프로그래밍, Django, SQL Alchemy, Elastic Search 등에서 일반적으로 사용되는 클래스를 사용하는 특정 DSL API를 통해 이러한 선언을 생성 할 수있는 방법을 제공합니다 변수. 클래스 변수 DSL이 다른 모델/형식에 대한 객체 직렬화에서 가장 자주 사용되는 반면, "dunder ifying"을 목표로하는 일반적인 클래스 선언 패키지는 일반적으로 예기치 않은 것이 아닙니다. https://github.com/python-attrs/attrs

몇몇 측면 노트 :

  • 현대 클래스 API의 DSL을 모두가) 인스턴스 변수/속성 선언 정적 언어 B) 불러 적어도 경우 프로토 타입 기반 프로그래밍 (클래스가 유사 객체 자체). 어떤 정적 또는 js 배경을 가진 devs에 대해 을 쉽게 파악할 수 있습니다.

  • 는 개인적으로 나는 일반은 DSL이 평균 프로그래머가 배울 수있는 너무 많은 오버 헤드가 이다 생각하지만, 일반 고전 DSL을로 확인 오전 문서는 일반적으로 부족 를 제공하고, DSL 디자인을 변경 수도 필요 OO 모델링은 엔터프라이즈 소프트웨어 개발에서 가장 잘 작동합니다.

+0

그건 내가 묻고있는 것이 아닙니다. 보통 속성은'__init__'에 선언되어 있습니다.이 접근법의 이름은 무엇입니까? – aisbaa

+1

속성이 실제로 정의되지 않은 __init__에 설정되었습니다 ... ORM 클래스 모델 정의가 될 수 있습니다 ... 클래스 (y) DSL ...선언적 클래스 수준 모델링? 일부 매뉴얼에서는 이것을 "SQLAlchemy 나 Django와 같은 다른 인기있는 ORM에서 볼 수있는 선언적 스타일"이라고 부릅니다. http://docs.peewee-orm.com/en/latest/peewee/models.html – Serge

+1

아마 ORM을 추가 할 수 있습니다. 그러나 모든 예는 일부 모델 변환 선언 API입니다. 나는 그 패턴 (슈퍼 클래스 + 선언 속성으로부터의 생성자/초기화 자의 관계)이 API와 모델 변환 밖에서 거의 필요 없다고 확신한다. 이제 선언 API 클래스/선언 클래스 속성. 이 문구 마이 그 레이션은 또한 한 클래스가 다른 클래스 속성이나 객체 속성을 선언하는 데 사용되는 경우도 포함합니다. 당신은 당신의 필요에 맞는 멋진 용어로 가득 찬 여러 가지 역동적 인 ORMS를 찾아 볼 수 있습니다. – Serge