2012-02-13 3 views
0

그래서 수업에 대해 배우고 있습니다. 왜 두 번째 코드 블록이하는 것과 똑같은 일을하기 위해 세 번째 코드 블록을 사용할 수 없습니까? p1person()에 할당해야하며 코드의 세 번째 블록 에서처럼 person()을 사용하지 않는 이유는 무엇입니까?파이썬에서의 클래스, 가변적 인 혼동

#class 
class person: 
def asdf(self): 
    self.firstname="" 
    self.lastname="" 
    self.id="" 
    self.email="" 
    self.friends=[] 

#second block of code 

p1 = person() 
p1.firstname="Dave" 
p1.lastname="Johnson" 
p1.id="2345239" 
p1.email="[email protected]" 
print p1.firstname 

#third block of code 

person().firstname="Dave" 
person().lastname="Johnson" 
person().id="2345239" 
person().email="[email protected]" 
print person().firstname 
+1

나는 당신이 배우고있는 튜토리얼을 다시 읽어야한다고 생각한다. –

답변

5

두 번째 블록에서 동일한 인스턴스의 속성을 변경합니다.

p1 = person()    # create new instance 
p1.firstname="Dave"   # change its first name 
p1.lastname="Johnson"  # change its last name 
# ... 
print p1.firstname   # access its firstname 

세 번째 블록에서는 각 줄에 새 인스턴스를 만듭니다.

person().firstname="Dave"  # create new instance and change its firstname 
person().lastname="Johnson" # create new instance and change its lastname 
# ... 
print person().firstname  # create new instance and access its firstname 

더 정확합니다 , 당신은에서 firstname 속성이 기능 만 asdf에 선언되어 있기 때문에, 아직 선언되지 않은 attirbute에 액세스하려고, 또는 같은 문제는, 마지막 라인에서 발생 광고 여기 p1.firstname="Dave"

의 두 번째 블록은 단순한 예이다 : 코드의 제 3 블록에서

>>> class A: 
...  def AA(self): 
...   self.a = 1 
... 
>>> a = A() 
>>> a.a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: A instance has no attribute 'a' 
>>> a.a = 1 
>>> a.a 
1 
+0

두 번째 코드 블록에서 p1은 첫 번째 줄에서 새 인스턴스가되고 다음 줄에서 변경됩니다. 그러나 세 번째 블록에서는 각 줄마다 새 인스턴스를 만들고 firstname 또는 lastname과 같은 변경 사항으로 각 인스턴스를 변경합니다. '인스턴스에 속성이 없습니다 '라는 오류 메시지가 ... 그래서'person()'의 인스턴스로 p1을 생성하면 파이썬에 firstname과 같은 속성이 있다는 것을 알려줍니까? 속성이 정확히 무엇인지 모르겠습니다. – ZCJ

+0

속성은 할당하려는 것입니다. 'p1'이'person' 인 경우'p1.firstname'은'person'의'firstname' 속성입니다. "p1을 person()"의 인스턴스로 생성하지 마십시오. (person()이 생성하는)'person' 클래스의 새로 생성 된 인스턴스를 변수'p1'에 할당합니다.'firstname'을 검사하고있는'person'이 당신이 지정한'firstname'과 같은'person'이 아니기 때문에 세번째 블록에서 에러 메시지를받습니다. 'p1'의'firstname'을 설정하고'p1'의'firstname'을 나중에 확인하면, 그것은 분명히 두 곳에서 모두 같은 '사람'입니다. –

3

, person() 각 호출은 person C의 새로운 인스턴스를 생성 젊은 여자. 그런 다음 코드는 해당 개체의 특성 값을 설정 한 다음 변수에 저장되지 않았기 때문에 전체 개체를 버립니다.

1

참고로 파이썬 스타일은 클래스에 낙타 케이스를 사용하는 것입니다. 이것은 문제의 일부입니다. 초기 뚜껑은 클래스 생성과 메소드 호출을 구별하는 데 도움이됩니다.

클래스를 정의 :

class Person(object): 
    def asdf(self): 
     self.firstname="" 
     self.lastname="" 
     self.id="" 
     self.email="" 
     self.friends=[] 

인스턴스를 만들기 : 함수 호출이 프로토 타입으로 클래스를 사용하여, 인스턴스를 구축 같은

p = Person() 

클래스 이름을 사용. 두 번째 블록에서는 인스턴스를 만들고 속성을 변경합니다.

세 번째 블록에서는 person이라는 네 개의 새 인스턴스를 만들고 하나의 애트리뷰트를 설정 한 다음 다른 애트리뷰트가 할당되었으므로 던져 버릴 수 있습니다. 이 http://docs.python.org/tutorial/classes.html

필요하지 않은 기본이되는 구현의 공정한 금액이 있습니다,하지만 클래스, 인스턴스 및 속성에 대한 몇 가지 중요한 세부 사항도있다 :

클래스의 작성자는 읽기 정말 가치가있다.

+0

쿨, 링크 고마워. 나는이 물건을 시작하고있다. 대문자 사용에 대한 흥미로운 점; 필자는 필연적 인 것처럼 보이지 않지만 "Person"이 언급하고있는 것을 암시하기 위해 나중에 실수를하는 것을 볼 수 있습니다. – ZCJ

관련 문제