필자는 수년 동안 일련의 텍스트 파일을 처리하기 위해 사용해온 파이썬 모듈을 사용하고 있습니다. 이제는 db (SQLAlchemy 사용)에 정보를 저장할 필요가 있지만 데이터베이스 지원없이 모듈을 사용할 수있는 유연성이 필요합니다. 즉, 실제로 sqlalchemy를 가져올 필요가 없습니다 (또는 설치됨). 지금 현재로, 나는 다음과 같은 것을 가지고있다 ... 나는 dbher를 사용 할지를 결정하는 wether에 따라 Product
또는 DBProduct
등을 만들고있다.런타임에서 데이터베이스 지원 추가
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Product(object):
pass
class WebSession(Product):
pass
class Malware(WebSession):
pass
class DBProduct(Product, Base):
pass
class DBWebSession(WebSession, DBProduct):
pass
class DBMalware(Malware, DBWebSession):
pass
그러나 나는 이것을 할 수있는 더 쉽고/깨끗한 방법이 있어야한다고 생각합니다. 나는 상속 혼란과 잠재적 문제들을 길 아래로 만들고 있다고 느낍니다. 이상 적으로는 db를 사용하기 위해 필요한 정보가 들어있는 Product
, WebSession
등의 단일 클래스를 만들고 싶습니다.하지만 enable_db_support()
과 같은 것을 호출 한 후에 만 활성화/기능 할 수 있습니다. 일단 그 함수가 호출되면, 내가 생성 한 객체와 관계없이 그 자체 (상속받은 모든 객체)는 모든 열 바인딩을 사용 가능하게합니다. 또한 어떻게 든 Product
과 DBProduct
을 하나에 포함시키는 방법을 찾으면 클래스, 때로는 동일한 기능의 2 버전이 필요합니다 : 1은 DB 지원이 가능하면 호출되고 그렇지 않으면 1입니다. 또한 enable_db_support()
이 호출 될 때 객체 계층 구조를 "재현"하는 것으로 간주했지만, 악몽으로 밝혀졌습니다.
도움을 주시면 감사하겠습니다.
감사합니다. 이것은 나를 위해 효과가있을 가능성이 있습니다. 나는 관계 문제를 조사해야 할 것입니다. 나는 '관계'에 많이 의지하는 경향이 있지만 여전히 효과가있을 수 있습니다. 감사. – redlamb
더 생각해 보면이 접근 방식을 고려해 보았지만 데이터베이스에 정보를 저장할 때 클래스의 정의 된 함수 중 일부를 잠재적으로 무시할 필요가 없었기 때문에 이러한 접근 방식을 고려하지 않았다고 생각합니다. 이 접근 방식을 사용하여 클래스의 기능 중 일부를 재정의하는 것이 가능한지 (또는 내가 어떻게 할 것인가) 알고 있습니까? 다시 한번 감사드립니다. – redlamb
@redlamb : 글쎄, 강력한 파이썬의 힘으로 클래스에 메소드를 할당함으로써 관계를 enable_db_support()에 추가 할 수있다 : DBProduct.versions = relationship ('ProductVersion', ...) '. 동일한 방법으로 메소드를 오버라이드 할 수 있습니다 :'def db_override_me (self, param1, ...) : ...'과 같은 새로운 (바인딩되지 않은) 메소드를 정의한 다음 클래스에 다시 할당하십시오 :'DBProduct .override_me = db_override_me'. 나는이 유형의 디자인에 더 나은 해결책이 있을지도 모른다는 두려워하지만 ... – van