development

파이썬에서 인스턴스 변수와 클래스 변수

big-blog 2020. 7. 24. 07:13
반응형

파이썬에서 인스턴스 변수와 클래스 변수


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

클래스 변수 :

class MyController(Controller):

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

  def action(self, request):
    pass

인스턴스 변수 :

class MyController(Controller):

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

  def action(self, request):
    pass

어쨌든 인스턴스가 하나 뿐인 경우 모든 변수를 인스턴스별로 만드는 것이 가장 좋습니다 (클래스에서 인스턴스로의 "상속"으로 인해 "빠른 조회"수준). 그리고이 작은 이점에 비하면 단점이 없습니다.


마이크와 알렉스의 조언을 더 반향하고 내 자신의 색을 추가하는 것.

인스턴스 속성을 사용하는 것이 일반적이고 관용적 인 파이썬입니다. 클래스 속성은 자주 사용되지 않습니다. 최소 13 년 연속 파이썬에서 프로덕션 코드에는 사용되지 않았습니다. 정적 및 클래스 메소드의 경우에도 마찬가지입니다. 특정 유스 케이스 또는 비정상적인 프로그래머가 파이썬 프로그래밍의 모호한 부분을 알고 싶어하지 않는 한 매우 일반적이지 않습니다.

alex는 답장에서 한 번의 조회 수준이 낮아서 액세스가 조금 더 빠를 것이라고 언급했습니다 ...이 기능이 아직 어떻게 작동하는지 모르는 사람들을 위해 더 자세히 설명하겠습니다. 변수 액세스와 매우 유사합니다. -검색은 다음 순서로 수행됩니다.

  1. 현지인
  2. 비 로컬
  3. 글로벌
  4. 내장

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

  1. 수업
  2. MRO (메소드 해결 순서)에 의해 결정된 기본 클래스

위의 예에서 path속성을 찾고 있다고 가정 해 봅시다 . " self.path" 와 같은 참조가 발생하면 , 파이썬은 일치하는 인스턴스 속성을 먼저 찾습니다. 실패하면 객체가 인스턴스화 된 클래스를 확인합니다. 마지막으로 기본 클래스를 검색합니다. alex가 언급했듯이 인스턴스에서 속성이 발견되면 클래스를 지연시키지 않으므로 시간이 약간 절약됩니다.

그러나 클래스 속성을 고집하는 경우이 작은 성능을 포기해야합니다. 또는 다른 대안은 인스턴스 대신 클래스 대신 클래스를 통해 객체를 참조하는 것입니다 (예 : MyController.path대신) self.path. 이는 지연된 조회를 해결할 수있는 직접 조회이지만 아래에서 알렉스가 언급 한 것처럼 전역 변수이므로 저장하려는 것으로 생각되는 비트를 잃게됩니다 ([global] 클래스 이름에 대한 로컬 참조를 작성하지 않는 한) ).


확실하지 않은 경우 인스턴스 속성이 필요할 수 있습니다.

클래스 속성은 특수한 경우에 가장 적합합니다. 가장 일반적인 유스 케이스는 메소드입니다. 인스턴스가 알아야 할 읽기 전용 상수에 클래스 속성을 사용하는 것은 드문 일 이 아니지만 ( 클래스 외부 에서 액세스하려는 경우 유일한 이점 이지만) 상태를 저장하는 데 신중해야합니다. . 이는 거의 원하지 않습니다. 인스턴스가 하나만 있더라도 다른 인스턴스와 마찬가지로 클래스를 작성해야합니다. 이는 일반적으로 인스턴스 속성을 사용함을 의미합니다.


Python에서 클래스 변수에 액세스하는 성능과 동일한 질문 -@Edward Loper에서 수정 한 코드

로컬 변수는 액세스가 가장 빠르며 모듈 변수, 클래스 변수, 인스턴스 변수와 밀접한 관련이 있습니다.

변수에 액세스 할 수있는 범위는 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/instance-variables-vs-class-variables-in-python

반응형