이 두 클래스는 어떻게 다른가요?
class A():
x=3
class B():
def __init__(self):
self.x=3
큰 차이가 있습니까?
이 두 클래스는 어떻게 다른가요?
class A():
x=3
class B():
def __init__(self):
self.x=3
큰 차이가 있습니까?
답변:
A.x
A는 클래스 변수 .
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]
그냥 보조 노트로 : self
실제로 단지 무작위로 선택된 단어, 모든 사람이 사용하는,하지만 당신은 또한 사용할 수 있습니다 this
, foo
또는 myself
또는 다른 어떤 당신이 원하는 그것은 클래스의 모든 비 정적 방법의 단지 첫 번째 매개 변수입니다. 이것은 단어 self
가 언어 구조가 아니라 이름 일뿐 임을 의미합니다 .
>>> class A:
... def __init__(s):
... s.bla = 2
...
>>>
>>> a = A()
>>> a.bla
2
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
이 예제로 설명하곤했는데
# 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
저는 방금 파이썬을 배우기 시작했고 이로 인해 한동안 저도 혼란 스러웠습니다. 이 모든 것이 일반적으로 어떻게 작동하는지 알아 내려고 다음과 같은 매우 간단한 코드를 생각해 냈습니다.
# 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'
.