인스턴스가 하나만있는 Python 클래스 : (단일) 클래스 인스턴스를 언제 작성해야합니까?


11

한 번만 인스턴스화되는 파이썬 클래스가 주어지면 클래스의 객체가 하나뿐입니다. 어떤 경우에 클래스와 직접 작업하는 대신 단일 클래스 인스턴스를 만드는 것이 타당한 지 궁금합니다.

비슷한 질문 이 있지만 다른 초점을 가지고 있습니다.

  1. 전역 변수와 함수를 클래스로 그룹화하고
  2. 파이썬 전용이 아닙니다. 후자는 (파이썬에서) 클래스도 객체라는 사실을 고려하지 않습니다.

최신 정보:

파이썬에서는 클래스와 객체로 다음을 수행 할 수 있습니다.

class A(object):
    pass

A.some_state_var = True
# Then later
A.some_state_var = False


my_a = A()

my_a.some_state_var = True
# Then later
my_a.some_state_var = False

따라서 클래스와 해당 클래스의 인스턴스 중에서 선택이 상태에 관한 방법 (파이썬)에 대해서는 어떻게 보지 않습니다. 둘 중 하나의 상태를 유지할 수 있습니다.

또한 클래스 / 클래스 인스턴스를 만들려는 동기는 Singleton 요구 사항을 시행하는 것이 아닙니다.

또한 새로운 유형을 만드는 것은별로 중요하지 않습니다.

동기 부여는 관련 코드와 데이터를 그룹화하고 인터페이스를 갖는 것입니다. 이것이 처음에 클래스 다이어그램의 클래스로 모델링 한 이유입니다. 구현에 관해서 만이 클래스를 인스턴스화할지 여부를 궁금해하기 시작했습니다.

답변:


16

한 번만 인스턴스화되는 파이썬 클래스가 주어지면 클래스의 객체가 하나뿐입니다. 어떤 경우에 클래스와 직접 작업하는 대신 단일 클래스 인스턴스를 만드는 것이 타당한 지 궁금합니다.

그래서 이것입니다 :

class Singleton:
    '''don't bother instantiating me'''
    clsvar1 = 'foo'

    @classmethod
    def foobar(cls, *args, **kwargs):
        if condition():
            cls.clsvar1 = 'bar'

이 대?

class Singleton:
    '''instantiate and use me'''
    def __init__(self):
        self.var1 = 'foo'

    def foobar(self, *args, **kwargs):
        if condition():
            self.var1 = 'bar'

추천

나는 분명히 인스턴스화하려는 것을 선호합니다. "사물 유형"을 만들 때 해당 유형의 항목을 생성한다는 의미입니다.

동기 부여는 관련 코드와 데이터를 그룹화하고 인터페이스를 갖는 것입니다.

즉, 원하는 것은 네임 스페이스이므로 모듈을 사용하지 않는 이유는 무엇입니까? 모듈은 싱글 톤, 그룹 관련 코드 및 데이터이며 조금 더 단순하고 아마도 더 파이썬적인 것으로 간주됩니다.

var1 ='foo'

def foobar(*args, **kwargs):
    global var1
    if condition():
        var1 = 'bar'

따라서 사용법은 다음과 같습니다.

from modules.singleton import Singleton
Singleton.foobar()

또는

from modules.singleton import Singleton
the_singleton = Singleton()
the_singleton.foobar()

이 작업을 수행:

from modules import singleton
singleton.foobar()

3
답변 주셔서 감사합니다. 모든 함수 (변수 포함)에 대해 새 모듈 (새 .py 파일)을 작성하도록 제안 하시겠습니까? 작은 .py 파일이 많이 생길 수 있습니다. 아니면 모든 "클래스가없는"기능과 변수를 하나의 모듈로 그룹화 하시겠습니까?
langlauf.io

한 가지 더 말 : "네가 원하는 것은 네임 스페이스이므로"라고 쓴다. 내가 원하는 것은 관련 코드, 즉 함수와 데이터를 한 곳에 그룹화하고 인터페이스를 갖는 것입니다. "Type"을 만드는 것은 그리 중요하지 않습니다. 디자인하는 동안 어쨌든 클래스 다이어그램의 클래스가 만들어 질 것입니다.
langlauf.io

2

어떤 경우에 클래스와 직접 작업하는 대신 단일 클래스 인스턴스를 만드는 것이 타당한 지 궁금합니다.

이것은 많은 사람들이 종교적 전쟁을하게 될 종교적 전쟁 중 하나입니다.

그러나 일반적으로 여러 번 본 관행은 클래스 메서드가 해당 클래스의 인스턴스를 만드는 데에만 관심을 가져야한다는 것입니다.

수업이 무엇인지, 수업의 목적 / 행동이 무엇인지 생각한다면, 이것은 의미가 있습니다. 클래스의 목적은 자체를 기반으로하는 객체의 인스턴스를 만드는 것 입니다. 건물을 지을 수도있는 청사진입니다. "User"클래스는 "user"객체를 만듭니다. "Dog"클래스는 "dog"객체 등을 만듭니다.

클래스 "X"에 추가 한 메소드가 "x"오브젝트 작성과 관련이있을 것입니다.

따라서 "x"객체가 하나만 필요한 경우에도 여전히 인스턴스화해야합니다.

"x"객체의 인스턴스를 만드는 것과 관련이없는 메서드를 X 클래스에 추가하면 예기치 않은 코드가 혼동 될 수 있습니다. 사람들이 어쨌든 이것을 한 실제 세계에는 물론 많은 예가 있지만, 내가 말한 것처럼 그 길은 종교 전쟁으로 이어집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.