2012-03-16 1 views
4

난 3 일 동안 열심히 노력하여 __init__과 "self"를 배우기 시작했습니다. 어려운 파이썬 학습 42에서 시작하여 파이썬 설명서의 일부인 Alan Gauld's chapter on Object-Oriented Programming, Stack threads like this one on "self", and this one을 읽으려고 계속합니다. 솔직히, 나는 나가기 전까지는 벽돌로 얼굴에 맞을 준비가되어있다.파이썬 : __init __ (self, foo)는 반드시 self.foo = foo를 따라야합니다.

즉, 처음에는 __init__ 초기 정의에서 정말 공통된 규칙을 발견했습니다.이 정의는 (self, foo)를 후속 조치 한 다음 해당 정의 내에서 self.foo = foo를 즉시 선언하는 것입니다.

LPTHW에서

, ex42 : 앨런 Gauld에서

class Game(object): 
    def __init__(self, start): 
     self.quips = ["a list", "of phrases", "here"] 
     self.start = start 

:

def __init__(self,val): self.val = val 

내가받지 못했습니다 하나의 큰 일이 있다고 볼 수있는 내가 그 끔찍한 공간에있어, 나는 그것에 대해 얼마나 많이 읽었는지에 상관없이 불투명 한 채로 남아 있습니다. 어쩌면 누군가가이 약간의 일관성을 나에게 설명 할 수 있다면 빛이 켜질 것입니다. 이는 변수 인 "foo"가 항상 첨부 된 def에 자동으로 할당되는 "self"매개 변수에 포함 된 (foo) 매개 변수와 동일하다고 말할 필요가 있기 때문입니다.

답변

6

에서 공부하고 싶을 수도 있습니다.

  • 내가 명 "일"의 유형 Game

  • 때마다이 있습니다

    느슨하게 당신이 말하고있는

    class Game(object): 
        def __init__(self, start): 
         self.start = start 
    

    을 말할 때, 말하기 새로운 Game이 생성되면, 일부는 나를 요구할 것입니다. 여분의 정보, start. (__init__를라는 Game의 초기화는,이 정보를 요청하기 때문입니다.)

  • 이니셜 라이저 (또한이 약간의 잘못된이야 있지만, "생성자"라한다)는 하는 개체를 알 필요가 (방금 전에 생성되었습니다) 초기화 중입니다. 이것은 첫 번째 매개 변수입니다. 일반적으로 관습에 따라 self이라고합니다 (하지만 다른 것을 호출 할 수는 있습니다 ...).

  • 게임에서 아마도 내가 준 start을 기억해야합니다. 그래서 변수 인스턴스를 생성하여, "내부"이 정보 자체를 저장도 이름 start (아무것도 특별한, 그것은 그냥 어떤 이름을 당신이 원하는), 그리고 start 변수에 start 매개 변수의 값을 할당.

    • 매개 변수의 값을 저장하지 않으면 나중에 사용할 수있는 정보가 없습니다.

희망 사항.

+0

좋은 설명 – Wei

+0

중요한 것은 'self.abc'와 같은 속성에 인수를 할당 할 수 있다는 것입니다. 동일한 방식으로 속성의 이름을 지정하는 것은 코드를 구조화하는 방법에 불과합니다. –

+0

@FelixKling : 좀 더 명확하게하기 위해 약간의 수정을했습니다. 감사합니다. – Mehrdad

0

매개 변수 이름은 함수/메서드에서 수행하는 역할 또는 해당 내용에 대한 정보를 전달하기 위해 의미가 있어야합니다.

생성자의 매개 변수는 새 인스턴스의 작업에 자주 필요하며 클래스의 다른 메서드에서도 필요한 정보를 포함하므로 훨씬 더 중요합니다.

playerList을 허용하는 Game 클래스가 있다고 가정 해 보겠습니다.

class Game: 

    def __init__(self, playerList): 
     self.playerList = playerList # or self.players = playerList 

    def printPlayerList(self): 
     print self.playerList   # or print self.players 

이 목록은 다양한 클래스 메소드에서 필요합니다. 따라서 self.playerList에 할당하는 것이 좋습니다. self.players에 할당 할 수도 있습니다. 더 편안하다고 느끼면 라고 생각하면 이해할 수 있습니다. 그러나 self.<somename>에 할당하지 않으면 다른 방법으로 액세스 할 수 없습니다.

매개 변수/특성/etc (there are some special class methods though)의 이름을 지정하는 방법에 특별한 것은 없지만 의미있는 이름을 사용하면 코드를 더 쉽게 이해할 수 있습니다. 아니면 위의 수업의 의미를 이해 하시겠습니까?

? :) 정확히 똑같지 만 이해하기가 더 어렵습니다. ...

2

실종 된 것이 무엇인지 잘 모르겠습니다. 그래서 몇 가지 기본적인 항목을 알려 드리겠습니다.

훨씬 더 일반적이다 파이썬 class__new__라는 객체, 사용자가 걱정하기에 비교적 드문 하나, 하나에 두 개의 "특별한"하는 초기화 이름이있다, __init__을했다.

클래스 개체 생성자를 호출하면 (예 : (예제를 기반으로) x = Game(args),이 먼저 개체를 보유 할 메모리를 얻으려면 Game.__new__ 호출하고 Game.__init__ 해당 메모리를 채 웁니다. 대부분의 경우 기본 메모리 인 object.__new__이 메모리를 할당하도록 허용 할 수 있습니다. (변경하지 않고 ID를 공유 할 수있는 특수한 이상한 경우에는 자신의 할당자를 사용할 수 있습니다. 정수는 예를 들어 이상한 일을하는 "메타 클래스"에도 해당합니다. 그러나 나중에 모두 주제입니다.) "생성자에 대한 모든 인수"와 앞에 이는 해당 객체 자체에 할당 된 메모리입니다. (대부분 "속성"의 사전 인 "보통"객체와 클래스의 마법 접착제에 대해서는 __slots__의 객체에 대해서는 속성 사전이 생략되었습니다.) 첫 번째 인자 인 self의 이름은 단지 규칙이지만 위반하지는 않습니다 당신이하는 경우 사람들은 당신을 미워할 것입니다. :-)

모든 인수를 생성자에 저장해야하는 것은 없습니다.당신은 어떤을 설정하거나 모든 인스턴스 속성을 당신이 좋아 :

class Weird(object): 
    def __init__(self, required_arg1, required_arg2, optional_arg3 = 'spam'): 
     self.irrelevant = False 
    def __str__(self): 
     ... 

것은 당신이 단순히 버려진 두 개의 인수를 전달하는 데 필요한, 주어진하고 있기 때문에 이상한() 인스턴스가 초기화 후 꽤 쓸모가 있다는 것입니다 또한 버려지 세 번째 선택적 인수 :

x = Weird(42, 0.0, 'maybe') 

그 버려지 인수를 필요로의 유일한 점은, 미래의 확장을위한 말하자면 (당신이 초기 개발하는 동안이 사용되지 않는 분야가있을 수 있습니다). 따라서 즉시 인수를 사용하지 않고 __init__에 인수를 저장하지 않으면 Weird에서 뭔가 이상하게 보입니다.

덧붙여 말하자면, (object)을 클래스 정의에 사용하는 유일한 이유는 이것이 "새로운 스타일"클래스 (매우 오래된 Python "인스턴스 전용"클래스와 구별되는)라는 것을 Python 2.x에 알려주는 것입니다. 하지만 일반적으로 그것을 사용하는 것이 가장 좋습니다. 위의 내용은 object.__new__을 true로 만듭니다. 예를 들어 :-) Python 3까지 - 오래된 스타일의 자료가 완전히 없어졌습니다.