복붙노트

[PYTHON] 파이썬 클래스 인스턴스 변수와 클래스 변수

PYTHON

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

파이썬에서 클래스 / 인스턴스 변수가 어떻게 작동하는지 이해하는 데 문제가 있습니다. 나는 왜이 코드를 시도 할 때 목록 변수가 클래스 변수 인 것 같은지 이해하지 못한다.

class testClass():
    list = []
    def __init__(self):
        self.list.append('thing')

p = testClass()
print p.list

f = testClass()
print f.list

산출:

['thing']
['thing', 'thing']

내가 이것을 할 때 인스턴스 변수 인 것 같다.

class testClass():
    def __init__(self):
        self.list = []
        self.list.append('thing')

p = testClass()
print p.list

f = testClass()
print f.list

산출:

['thing']
['thing']

해결법

  1. ==============================

    1.이것은 파이썬이 이름을 ..로 해석하는 방식 때문입니다. self.list를 작성할 때 파이썬 런타임은 먼저 인스턴스 객체에서 그것을 찾음으로써 목록 이름을 분석하려고 시도합니다. 그리고 발견되지 않으면 클래스에 예.

    이것은 파이썬이 이름을 ..로 해석하는 방식 때문입니다. self.list를 작성할 때 파이썬 런타임은 먼저 인스턴스 객체에서 그것을 찾음으로써 목록 이름을 분석하려고 시도합니다. 그리고 발견되지 않으면 클래스에 예.

    단계별로 살펴 보겠습니다.

    self.list.append(1)
    

    그러나 당신이 이름을 묶을 때 상황은 다릅니다 :

    self.list = []
    

    그래서 항상 인스턴스 변수입니다.

    첫 번째 예제는 클래스 인스턴스에 목록을 작성합니다.이 시간은 활성 범위이므로 (셀프가 아님). 그러나 두 번째 예제는 자체의 범위에 명시 적으로 목록을 만듭니다.

    더 흥미로운 예가 될 수 있습니다 :

    class testClass():
        list = ['foo']
        def __init__(self):
            self.list = []
            self.list.append('thing')
    
    x = testClass()
    print x.list
    print testClass.list
    del x.list
    print x.list
    

    그러면 다음과 같이 인쇄됩니다.

    ['thing']
    ['foo']
    ['foo']
    

    인스턴스 이름을 삭제하는 순간 클래스 이름은 자체 참조를 통해 볼 수 있습니다.

  2. ==============================

    2.파이썬에는 이름을 찾는 것에 대한 흥미로운 규칙이 있습니다. 정말로 마음을 굽히고 싶다면 다음 코드를 사용해보십시오.

    파이썬에는 이름을 찾는 것에 대한 흥미로운 규칙이 있습니다. 정말로 마음을 굽히고 싶다면 다음 코드를 사용해보십시오.

    class testClass():
        l = []
        def __init__(self):
            self.l = ['fred']
    

    그러면 각 인스턴스에 클래스 변수 l을 마스크하는 l이라는 변수가 생깁니다. self .__ class __. l을 수행하면 클래스 변수를 사용할 수 있습니다.

    내가 생각하는 방식은 이것이다. instance.variable을 할 때마다 (메소드 이름이라 할지라도, 그것들은 값이 함수가되는 변수 일 뿐이다) 인스턴스의 사전에서 찾는다. 그리고 그것을 찾을 수 없다면, 인스턴스의 클래스 사전에서 그것을 찾으려고합니다. 이것은 변수가 '읽기'중인 경우에만 해당됩니다. 할당 된 경우 항상 인스턴스 사전에 새 항목을 만듭니다.

  3. ==============================

    3.첫 번째 예에서 list는 클래스의 속성으로 모든 인스턴스에서 공유됩니다. 즉, testClass 유형의 객체가 없어도 액세스 할 수 있습니다.

    첫 번째 예에서 list는 클래스의 속성으로 모든 인스턴스에서 공유됩니다. 즉, testClass 유형의 객체가 없어도 액세스 할 수 있습니다.

    >>> class testClass():
    ...     list = []
    ...     def __init__(self):
    ...             self.list.append("thing")
    ... 
    >>> testClass.list
    []
    >>> testClass.list.append(1)
    >>> testClass.list
    [1]
    

    그러나 모든 객체는 클래스와 서로 목록 속성을 공유합니다.

    >>> testObject = testClass()
    >>> testObject.list
    [1, 'thing']
    >>> testClass.list
    [1, 'thing']
    >>> 
    >>> testObject2 = testClass()
    >>> testClass.list
    [1, 'thing', 'thing']
    >>> testObject2.list
    [1, 'thing', 'thing']
    
  4. ==============================

    4.클래스를 인스턴스화하면 __init__ 메소드가 자동으로 실행됩니다.

    클래스를 인스턴스화하면 __init__ 메소드가 자동으로 실행됩니다.

    첫 번째 경우 목록은 클래스 속성이며 모든 인스턴스에서 공유됩니다. p를 인스턴스화 할 때 하나를 추가 했으므로 인스턴스화 된 f (첫 번째 호출에서 이미 첫 번째 인스턴스가 추가 되었음)를 추가했기 때문에 두 가지가 있습니다.

  5. from https://stackoverflow.com/questions/8701500/python-class-instance-variables-and-class-variables by cc-by-sa and MIT license