Python-클래스에서 "self"를 사용하는 이유는 무엇입니까?


82

이 두 클래스는 어떻게 다른가요?

class A():
    x=3

class B():
    def __init__(self):
        self.x=3

큰 차이가 있습니까?


6
아니요, 중복이 아닙니다.

1
@hop : 흥미로운 주장이지만 중복이 아니라는 예나 증거를 제공하지 않았습니다. 왜 그런 말을 해?
S.Lott

2
@ S.Lott-응? 다른 질문은 왜 우리가 명시 적으로 self를 전달해야하는지 묻는 것입니다. 이것은 클래스와 인스턴스 변수 때문에 차이점에 대해 묻는 것입니다.
Dana

1
@ S.Lott 같은 질문이 아닙니다. 나는 그것을 묻기 전에 그것을 보았습니다.
ryeguy

2
@ S.Lott : 68282는 왜 self를 메서드의 첫 번째 인수로 명시 적으로 지정해야하는지에 대한 쓸모없는 질문입니다. 이 질문은 클래스와 인스턴스 멤버의 차이점에 대해 묻습니다. S.Lott, 나는 SO에 대한 당신의 기여를 정말 좋아하지만 이번에는 당신이 틀 렸습니다.

답변:


137

A.xA는 클래스 변수 . B'들 self.x이다 인스턴스 변수 .

즉, A의는 x인스턴스간에 공유됩니다.

목록과 같이 수정할 수있는 것으로 차이점을 설명하는 것이 더 쉬울 것입니다.

#!/usr/bin/env python

class A:
    x = []
    def add(self):
        self.x.append(1)

class B:
    def __init__(self):
        self.x = []
    def add(self):
        self.x.append(1)

x = A()
y = A()
x.add()
y.add()
print("A's x:", x.x)

x = B()
y = B()
x.add()
y.add()
print("B's x:", x.x)

산출

A's x: [1, 1]
B's x: [1]

8
스크립트의 출력을 게시하면 직접 복사하여 실행하지 않고도 차이점을 확인할 수 있습니다.
Martin

7
출력을 추가했습니다.
UnkwnTech

2
파이썬의 자체가 Java의 자체와 동등합니까? 멍청함을 실례합니다
Jean Azzopardi

2
@Jean-Yes-ish-self는 인스턴스 메소드의 첫 번째 매개 변수에 주어진 관습적인 이름이어야하며, 파이썬은 인스턴스 메소드의 첫 번째 인수로 인스턴스 메소드의 현재 인스턴스를 명시 적으로 전달합니다. 하지만 자바와 같은 일이 있어요 않습니다
더글러스 Leeder 씨

@Jean Azzopardi : self는 거의 Java (및 C ++)와 비슷합니다. 자아는 단순히 필요합니다. 이 때로는 자바 컴파일러에 의해 추론된다 (이 필요한 것 다른 시간.)
S. 로트

56

그냥 보조 노트로 : self실제로 단지 무작위로 선택된 단어, 모든 사람이 사용하는,하지만 당신은 또한 사용할 수 있습니다 this, foo또는 myself또는 다른 어떤 당신이 원하는 그것은 클래스의 모든 비 정적 방법의 단지 첫 번째 매개 변수입니다. 이것은 단어 self가 언어 구조가 아니라 이름 일뿐 임을 의미합니다 .

>>> class A:
...     def __init__(s):
...        s.bla = 2
... 
>>> 
>>> a = A()
>>> a.bla
2

1
왜 이것은 대답이 아니라 코멘트인가
Gabriel Petersson

23

Ax는 클래스 변수이며 인스턴스 내에서 특별히 재정의되지 않는 한 A의 모든 인스턴스에서 공유됩니다. Bx는 인스턴스 변수이며 B의 각 인스턴스에는 고유 한 버전이 있습니다.

다음 Python 예제가 명확히 할 수 있기를 바랍니다.


    >>> class Foo():
    ...     i = 3
    ...     def bar(self):
    ...             print 'Foo.i is', Foo.i
    ...             print 'self.i is', self.i
    ... 
    >>> f = Foo() # Create an instance of the Foo class
    >>> f.bar()
    Foo.i is 3
    self.i is 3
    >>> Foo.i = 5 # Change the global value of Foo.i over all instances
    >>> f.bar()
    Foo.i is 5
    self.i is 5
    >>> f.i = 3 # Override this instance's definition of i
    >>> f.bar()
    Foo.i is 5
    self.i is 3

16

이 예제로 설명하곤했는데

# By TMOTTM

class Machine:

    # Class Variable counts how many machines have been created.
    # The value is the same for all objects of this class.
    counter = 0

    def __init__(self):

        # Notice: no 'self'.
        Machine.counter += 1

        # Instance variable.
        # Different for every object of the class.
        self.id = Machine.counter

if __name__ == '__main__':
    machine1 = Machine()
    machine2 = Machine()
    machine3 = Machine()

    #The value is different for all objects.
    print 'machine1.id', machine1.id
    print 'machine2.id', machine2.id
    print 'machine3.id', machine3.id

    #The value is the same for all objects.
    print 'machine1.counter', machine1.counter
    print 'machine2.counter', machine2.counter
    print 'machine3.counter', machine3.counter

그러면 출력은

machine1.id 1
machine2.id 2
machine3.id 3

machine1. 카운터 3
machine2.counter 3
machine3.counter 3

3

저는 방금 파이썬을 배우기 시작했고 이로 인해 한동안 저도 혼란 스러웠습니다. 이 모든 것이 일반적으로 어떻게 작동하는지 알아 내려고 다음과 같은 매우 간단한 코드를 생각해 냈습니다.

# Create a class with a variable inside and an instance of that class
class One:
    color = 'green'

obj2 = One()


# Here we create a global variable(outside a class suite).
color = 'blue'         

# Create a second class and a local variable inside this class.       
class Two:             
    color = "red"

    # Define 3 methods. The only difference between them is the "color" part.
    def out(self):     
        print(self.color + '!')

    def out2(self):
        print(color + '!')

    def out3(self):
        print(obj2.color + '!')

# Create an object of the class One
obj = Two()

우리가 전화 out()하면 다음을 얻습니다.

>>> obj.out()

red!

전화 할 때 out2():

>>> obj.out2()

blue!

전화 할 때 out3():

>>> obj.out3()

green!

따라서 첫 번째 방법 self에서 파이썬은 변수 (속성)를 사용해야한다고 지정합니다.이 변수는 우리가 생성 한 클래스 객체에 "속한다"글로벌 객체 (클래스 외부)가 아닙니다. 그래서 color = "red". 메서드에서 파이썬 self은 우리가 만든 객체의 이름을 암시 적으로 대체 합니다 ( obj). self.color수단 "나는 무엇입니까 color="red"에서 obj"

두 번째 방법 self에서는 색상을 가져와야하는 객체를 지정할 필요가 없으므로 전역 색상을 가져옵니다 color = 'blue'.

세 번째 방법에서 self우리가 사용 하는 대신 obj2-가져올 다른 객체의 이름입니다 color. 가져옵니다 color = 'green'.

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