programing

인스턴스가 하나만 있는 경우 인스턴스 또는 클래스 특성을 사용해야 합니까?

instargram 2023. 10. 14. 09:33
반응형

인스턴스가 하나만 있는 경우 인스턴스 또는 클래스 특성을 사용해야 합니까?

Python 클래스가 있는데 런타임에 인스턴스가 하나만 필요하므로 속성은 인스턴스가 아니라 클래스당 한 번만 있으면 충분합니다.둘 이상의 인스턴스가 있을 경우(이 인스턴스는 발생하지 않을 경우) 모든 인스턴스의 구성이 동일해야 합니다.다음 옵션 중 어떤 것이 더 나은지 아니면 더 "이매틱한" 파이썬인지 궁금합니다.

클래스 변수:

class MyController(Controller):

  path = "something/"
  children = [AController, BController]

  def action(self, request):
    pass

인스턴스(instance) 변수:

class MyController(Controller):

  def __init__(self):
    self.path = "something/"
    self.children = [AController, BController]

  def action(self, request):
    pass

어쨌든 인스턴스가 한 개뿐이라면, 모든 변수를 인스턴스별로 만드는 것이 가장 좋습니다. 단순히 (계층 간의 "상속"으로 인한 "조회" 수준이 한 단계 낮아지기 때문에) 더 빨리 액세스할 수 있기 때문입니다. 그리고 이 작은 이점을 무시할 수 있는 단점이 없습니다.

마이크알렉스의 충고를 더 되새기고 내 색깔을 더해서...

인스턴스(instance) 특성을 사용하는 것이 일반적인 방법입니다.좀더 관용적인 파이썬클래스 속성은 사용 사례가 특수하기 때문에 많이 사용되지 않습니다.정적인 방법과 수업 방법에 대해서도 마찬가지입니다."정상적인" 방법입니다.그것들은 특정한 사용 사례를 다루는 특별한 구성요소이며, 그렇지 않으면 파이썬 프로그래밍의 모호한 구석을 알고 있음을 과시하고자 하는 한 비정상적인 프로그래머에 의해 만들어진 코드입니다.

Alex는 그의 답장에서 한 번만 조회하면 접속이 (조금) 빨라질 것이라고 언급했습니다.이것이 어떻게 작동하는지 아직 모르는 분들을 위해 좀 더 자세히 말씀드리겠습니다.이것은 변수 접근과 매우 유사합니다. 검색 순서는 다음과 같습니다.

  1. 현지인
  2. 현지인이 아닌
  3. 세계적인
  4. 붙박이의

속성 액세스의 경우 순서는 다음과 같습니다.

  1. 사례
  2. 학급
  3. MRO(방법 해상도 순서)에 의해 결정되는 기본 클래스

두 기법 모두 "인사이드 아웃" 방식으로 작동합니다. 즉, 대부분의 로컬 객체를 먼저 검사한 다음 외부 레이어를 순차적으로 검사합니다.

, .path기여하다."와 같은 self.path) 합니다." Python 합니다.실패하면 개체가 인스턴스화된 클래스를 확인합니다.마지막으로 기본 클래스를 검색합니다.알렉스가 말했듯이, 만약 당신의 속성이 이 인스턴스에서 발견된다면, 다른 곳을 찾을 필요가 없기 때문에, 당신은 약간의 시간을 절약할 수 있습니다.

그러나 클래스 속성을 고집하는 경우 추가 조회가 필요합니다.또는 다른 대안은 인스턴스 대신 클래스를 통해 개체를 참조하는 것입니다.MyController.pathself.path와 같이 됩니다 참조를 한 이는 지연된 조회를 우회하는 직접 조회이지만, 알렉스가 아래에 언급한 것처럼 전역 변수이므로 저장할 것으로 생각했던 비트를 잃게 됩니다([global] 클래스 이름에 대한 로컬 참조를 만들지 않는 한).).

결론적으로 인스턴스(instance) 특성을 대부분 사용해야 합니다.그러나 클래스 속성이 해당 작업에 적합한 도구인 경우가 있을 것입니다.합니다를 에 이에 사용하는 합니다. 왜냐하면 를 사용하기 때문입니다.self인스턴스 속성 개체와 섀도 액세스 권한만 같은 이름의 클래스 속성에 부여합니다.이 경우 클래스 이름을 사용하여 속성을 참조해야 합니다.

의심스러운 경우 인스턴스(instance) 특성을 원할 수 있습니다.

클래스 속성은 의미가 있는 특수한 경우에 가장 적합합니다.매우 일반적인 사용 사례는 방법뿐입니다.인스턴스가 알아야 할 읽기 전용 상수에 클래스 속성을 사용하는 것은 드물지 않지만(클래스 외부에서 액세스할 수 있는 유일한 이점은 있지만), 원하는 상태가 아닌 상태를 저장하는 데 주의해야 합니다.인스턴스가 하나만 있더라도 다른 클래스처럼 클래스를 작성해야 합니다. 이는 일반적으로 인스턴스 특성을 사용한다는 것을 의미합니다.

Python에서 클래스 변수에 액세스하는 성능에 대한 동일한 질문 - 여기 @Edward Loper에서 가져온 코드

Local Variables가 가장 빨리 액세스할 수 있으며 모듈 변수와 거의 연결되어 있고 Class Variables, Instance Variables가 그 다음입니다.

다음에서 변수에 액세스할 수 있는 범위는 4개입니다.

  1. 인스턴스 변수(self.varname)
  2. 클래스 변수(Classname.varname)
  3. 모듈 변수(VARNAME)
  4. 로컬 변수(varname)

테스트:

import timeit

setup='''
XGLOBAL= 5
class A:
    xclass = 5
    def __init__(self):
        self.xinstance = 5
    def f1(self):
        xlocal = 5
        x = self.xinstance
    def f2(self):
        xlocal = 5
        x = A.xclass
    def f3(self):
        xlocal = 5
        x = XGLOBAL
    def f4(self):
        xlocal = 5
        x = xlocal
a = A()
'''
print('access via instance variable: %.3f' % timeit.timeit('a.f1()', setup=setup, number=300000000) )
print('access via class variable: %.3f' % timeit.timeit('a.f2()', setup=setup, number=300000000) )
print('access via module variable: %.3f' % timeit.timeit('a.f3()', setup=setup, number=300000000) )
print('access via local variable: %.3f' % timeit.timeit('a.f4()', setup=setup, number=300000000) )

결과:

access via instance variable: 93.456
access via class variable: 82.169
access via module variable: 72.634
access via local variable: 72.199

언급URL : https://stackoverflow.com/questions/2714573/should-i-use-instance-or-class-attributes-if-there-will-only-be-one-instance

반응형