2014-04-25 2 views
29

내가 파이썬 상당히 새로운 오전,이 글주의 : 그러나, 그것으로 장난 후 Python __init__ and self what do they do?Python Classes without using def __init__(self)def의 유용성 __init __ (self)?

을, 나는이 두 클래스 (

class A(object): 
    def __init__(self): 
     self.x = 'Hello' 

    def method_a(self, foo): 
     print self.x + ' ' + foo 

결과 - 분명히 상당을 줄 것으로 나타났습니다 this question)

class B(object): 
    x = 'Hello' 
    def method_b(self,foo): 
     print self.x + ' ' + foo 
에서 0

이 둘 사이에는 실제 차이점이 있습니까? 또는 좀 더 일반적으로 __init__이 클래스의 속성에 대해 본질적으로 다른 내용을 변경합니까? the documentation에는 인스턴스가 생성 될 때 __init__이 호출된다고 언급되어 있습니다. 인스턴스화 전에 Bx이 설정된다는 의미입니까?

class A(object): 
    def __init__(self): 
     self.lst = [] 

class B(object): 
    lst = [] 

를 지금 시도 :

답변

32

그래, 이것 좀 봐

>>> x = B() 
>>> y = B() 
>>> x.lst.append(1) 
>>> y.lst.append(2) 
>>> x.lst 
[1, 2] 
>>> x.lst is y.lst 
True 

을이 :

>>> x = A() 
>>> y = A() 
>>> x.lst.append(1) 
>>> y.lst.append(2) 
>>> x.lst 
[1] 
>>> x.lst is y.lst 
False 
이 클래스 B에서 그 X가 확정되는 것을 의미 하는가 인스턴스화하기 전에?

예, 클래스 속성입니다 (인스턴스간에 공유 됨). 클래스 A에있는 동안 그것은 인스턴스 속성입니다. 문자열이 변경되지 않으므로 시나리오에 실제 차이가 없습니다. 단, 클래스 B는 모든 인스턴스에 대해 하나의 문자열 만 정의하므로 메모리 사용이 적습니다. 그러나 나의 예에는 거대한 것이있다.

+2

한 클래스이기 때문에 잊지 마세요 시도 할 당신이 수있는 경우에 사용할 필요 없다 초기화하기 객체를 사용하면 언제든지 클래스의 속성 자체를 변경할 수 있습니다. 'class A : 패스; A.lst = list (range (6))'. – kojiro

9

첫 번째 예제에는 클래스 인스턴스의 변수가 있습니다. 이 변수는 인스턴스를 통해서만 액세스 할 수 있습니다 (자체 필수).

class A(): 
    def __init__(self): 
     self.x = 'hello' 

print A.x -> AttributeError 
print A().x -> 'hello' 

두 번째 예에서는 정적 변수가 있습니다. 당신은 클래스의 이름이 변수 덕분에 액세스 할 수있는 정적 변수와 같은 이름을 가진 인스턴스 변수를 가질 수 사실

class A(): 
    x = 'hello' 

print A.x -> 'hello' 
print A().x -> 'hello' 

: 정적 값이 공유

class A(): 
    x = 'hello' 
    def __init__(self): 
     self.x = 'world' 

print A.x -> hello 
print A().x -> world 

http://linuxwell.com/2011/07/21/static-variables-and-methods-in-python/

:

class A(): 
    x = 'hello' 

    @staticmethod 
    def talk(): 
     print A.x 

a = A() 
print a.talk() -> hello 

A.x = 'world' 
print a.talk() -> world 

모든 인스턴스 사이에 당신은 여기에 좋은 기사가3210
4

다른 사람들이 말한 것처럼 클래스의 변수와 클래스의 변수 인스턴스의 차이점이 있습니다. 다음 예제를 참조하십시오.등 튜플, 문자열, 그 차이를 발견하기 어렵습니다와 같은 불변의 객체에 대한

>>> class A: 
...  a = [] 
... 
>>> class B: 
...  def __init__(self): 
...   self.b = [] 
... 
>>> a1 = A() 
>>> a1.a.append('hello') 
>>> a2 = A() 
>>> a2.a 
['hello'] 
>>> b1 = B() 
>>> b1.b.append('goodbye') 
>>> b2 = B() 
>>> b2.b 
[] 

하지만 mutables을 위해, 그 클래스의 모든 인스턴스간에 공유되는 적용 모든 — 변경 사항이 변경됩니다.

키워드 인수 기본값에 대해서도 동일한 문제가 발생합니다.

>>> class A: 
...  def __init__(self, a=[]): 
...   a.append('hello') 
...   print(a) 
... 
>>> A() 
['hello'] 
>>> A() 
['hello', 'hello'] 
>>> A() 
['hello', 'hello', 'hello'] 

>>> class B: 
...  def __init__(self, b=None): 
...   if b is None: 
...    b = [] 
...   b.append('goodbye') 
...   print(b) 
... 
>>> B() 
['goodbye'] 
>>> B() 
['goodbye'] 
>>> B() 
['goodbye'] 

이 동작은 많은 새로운 Python 프로그래머와 충돌합니다. 이 구분을 일찍 발견하는 데 좋습니다! 사용

0

당신이 사용하려는 경우 단지

enter code here 

class some(): 
    def main(self): 
     self.x=10 
    def mathod_a(self,foo): 
     print self.x+foo' 

및 초기화 그것이

enter code here 
class some(): 
def main(self): 
    print(x) 
def init(self,x): 
    self.x=x 
    main() 
관련 문제