복붙노트

[PYTHON] 파이썬 '자체'변수를 초급자에게 설명하기 [duplicate]

PYTHON

파이썬 '자체'변수를 초급자에게 설명하기 [duplicate]

나는 OOP 특수 용어와 개념을 거의 모르고있다. 개념적으로 객체가 무엇인지 알고 객체에는 메소드가 있습니다. 심지어 파이썬에서는 클래스가 객체라는 것을 이해합니다! 멋지다, 나는 그것이 무엇을 의미하는지 모른다. 나와 함께 클릭하지 않습니다.

나는 현재 파이썬에 대한 나의 이해를 비추어 줄 구체적인 몇 가지 해답을 이해하려고 노력 중이다.

첫 번째 대답에서 저자는 다음 코드를 예제로 사용합니다.

>>> class Bank(): # let's create a bank, building ATMs
...    crisis = False
...    def create_atm(self) :
...        while not self.crisis :
...            yield "$100"

나는 자기가 가리키고있는 것을 즉시 깨우치지 않는다. 이것은 확실히 클래스를 이해하지 못하는 증상이며, 나는 어느 시점에서 작업 할 것입니다. 명확히하기 위해

>>> def func():
...   for i in range(3):
...     print i

필자는 목록 범위 (3)에있는 항목을 가리킨다는 것을 이해합니다. 이는 함수에 있기 때문에 전역 적이 지 않은 항목입니다. 그러나 자기가 "가리키는 것"은 무엇입니까?

해결법

  1. ==============================

    1.나는 당신을 위해 클래스와 객체에 대한 약간의 혼동을 해결하려고 노력할 것이다. 다음 코드 블록을 살펴 보겠습니다.

    나는 당신을 위해 클래스와 객체에 대한 약간의 혼동을 해결하려고 노력할 것이다. 다음 코드 블록을 살펴 보겠습니다.

    >>> class Bank(): # let's create a bank, building ATMs
    ...    crisis = False
    ...    def create_atm(self) :
    ...        while not self.crisis :
    ...            yield "$100"
    

    댓글은 약간 기만적입니다. 위의 코드는 은행을 "생성하지"않습니다. 그것은 은행이 무엇인지 정의합니다. 은행이란 위기라는 속성과 create_atm이라는 기능을 가진 것입니다. 그것은 위의 코드에서 말하는 것입니다.

    이제 은행을 실제로 만들어 보겠습니다.

    >>> x = Bank()
    

    거기서, x는 이제 은행입니다. x는 재산 위기와 create_atm 함수를 가지고있다. x.create_atm () 호출; 파이썬에서는 Bank.create_atm (x) 호출과 동일하므로 self는 x를 참조합니다. y라는 다른 은행을 추가하면 y.create_atm ()을 호출하면 위기의 y 값을 보게되며, x 자체가 y를 참조하기 때문에 x의 값은 아닙니다.

    자기는 명명 규칙 일 뿐이지 만 그 일에 매달리는 것이 좋습니다. 위의 코드가 다음과 동일하다는 점을 지적 할 가치가 있습니다.

    >>> class Bank(): # let's create a bank, building ATMs
    ...    crisis = False
    ...    def create_atm(thisbank) :
    ...        while not thisbank.crisis :
    ...            yield "$100"
    
  2. ==============================

    2.obj.method (arg1, arg2) 호출 문법을 메소드 (obj, arg1, arg2)를 호출하는 순수 구문 론적 설탕으로 생각하는 데 도움이 될 수 있습니다 (메소드가 obj 유형을 통해 조회되고 전역 변수가 아님).

    obj.method (arg1, arg2) 호출 문법을 메소드 (obj, arg1, arg2)를 호출하는 순수 구문 론적 설탕으로 생각하는 데 도움이 될 수 있습니다 (메소드가 obj 유형을 통해 조회되고 전역 변수가 아님).

    이렇게 보면 obj가 함수에 대한 첫 번째 인수가되며,이 인수는 전통적으로 매개 변수 목록에서 self라는 이름을 갖습니다. (사실, 다른 이름으로 지정할 수 있고 코드가 올바르게 작동하지만 다른 파이썬 코드 작성자는 눈살을 찌푸리게됩니다.)

  3. ==============================

    3."self"는 호출 될 때 클래스 인스턴스의 메서드에 자동으로 전달되는 인스턴스 객체로, 호출 한 인스턴스를 식별합니다. "self"는 메소드 내부에서 객체의 다른 속성이나 메소드에 액세스하는 데 사용됩니다. (메소드는 기본적으로 클래스에 속하는 함수입니다)

    "self"는 호출 될 때 클래스 인스턴스의 메서드에 자동으로 전달되는 인스턴스 객체로, 호출 한 인스턴스를 식별합니다. "self"는 메소드 내부에서 객체의 다른 속성이나 메소드에 액세스하는 데 사용됩니다. (메소드는 기본적으로 클래스에 속하는 함수입니다)

    이미 사용 가능한 인스턴스가있을 때 메서드를 호출 할 때 "self"를 사용할 필요가 없습니다.

    메소드 내부에서 "some_attribute"속성에 액세스 :

    class MyClass(object):
        some_attribute = "hello"
    
        def some_method(self, some_string):
            print self.some_attribute + " " + some_string
    

    기존 인스턴스에서 "some_attribute"속성 액세스 :

    >>> # create the instance
    >>> inst = MyClass()
    >>>
    >>> # accessing the attribute
    >>> inst.some_attribute
    "hello"
    >>> 
    >>> # calling the instance's method
    >>> inst.some_method("world") # In addition to "world", inst is *automatically* passed here as the first argument to "some_method".
    hello world
    >>> 
    

    다음은 자기가 인스턴스와 동일하다는 것을 보여주기위한 약간의 코드입니다.

    >>> class MyClass(object):
    >>>     def whoami(self, inst):
    >>>         print self is inst
    >>>
    >>> local_instance = MyClass()
    
    >>> local_instance.whoami(local_instance)
    True
    

    다른 사람들이 언급했듯이, 관습에 따라 "자아"라고 이름 지어졌지만 아무 것도 명명 할 수 있습니다.

  4. ==============================

    4.self는 Bank의 현재 인스턴스를 나타냅니다. 새 은행을 만들고 create_atm을 호출하면 self가 암시 적으로 파이썬에 전달되어 작성한 은행을 참조하게됩니다.

    self는 Bank의 현재 인스턴스를 나타냅니다. 새 은행을 만들고 create_atm을 호출하면 self가 암시 적으로 파이썬에 전달되어 작성한 은행을 참조하게됩니다.

  5. ==============================

    5.self는 함수에 전달 된 인수입니다. 파이썬에서이 첫 번째 인수는 메소드가 호출 된 객체입니다. 다른 말로:

    self는 함수에 전달 된 인수입니다. 파이썬에서이 첫 번째 인수는 메소드가 호출 된 객체입니다. 다른 말로:

    class Bar(object):
        def someMethod(self):
            return self.field
    
    bar = Bar()
    
    bar.someMethod()
    Bar.someMethod(bar)
    

    마지막 두 줄은 동일한 동작을합니다. bar가 Bar의 하위 클래스의 객체를 참조하지 않는 한 someMethod ()는 다른 함수 객체를 참조 할 수 있습니다.

    "특별한"첫 번째 인수의 이름을 원하는대로 지정할 수 있습니다. 즉, self는 메소드의 규칙입니다.

    자기라는 이름은 그 기능의 맥락에서 존재하지 않는다. 이것을 사용하면 NameError가 발생합니다.

    성적 증명서의 예 :

    >>> class Bar(object):
    ...     def someMethod(self):
    ...         return self.field
    ...
    >>> bar = Bar()
    >>> bar.field = "foo"
    >>> bar.someMethod()
    'foo'
    >>> Bar.someMethod(bar)
    'foo'
    >>> def fn(i):
    ...     return self
    ...
    >>> fn(0)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in fn
    NameError: global name 'self' is not defined
    
  6. ==============================

    6.하나의 루비스트의 관점 (루비는 나의 첫 번째 프로그래밍 언어이므로 너무 단순화되어 잠재적으로 잘못된 추상화를 사용하는 것에 대해 사과한다.)

    하나의 루비스트의 관점 (루비는 나의 첫 번째 프로그래밍 언어이므로 너무 단순화되어 잠재적으로 잘못된 추상화를 사용하는 것에 대해 사과한다.)

    내가 말할 수있는 한 도트 연산자는 다음과 같습니다.

    os.path
    

    os가 첫 번째 변수로 "보이지 않게"path ()에 전달되는 것과 같습니다.

    마치 os.path가 정말로 다음과 같습니다.

    path(os)
    

    데이지 체인 (daisy chain)이 있다면 나는 이것을 상상한다.

    os.path.filename
    

    현실에서 이런 식으로 될 것입니다 * :

    filename(path(os))
    

    여기 공격적인 부분이 온다. 따라서 자기 변수를 사용하면 CLASS METHOD (루비스트 관점에서 보면 파이썬 '인스턴스 메소드'는 클래스 메소드로 보입니다 ...)가 인스턴스 메소드를 첫 번째 변수로 전달함으로써 인스턴스 메소드로 작동합니다 위의 "부적절한"점 방식을 통해). 자기가 인스턴스가 아니 었는가?

    c = ClassName()
    c.methodname
    

    하지만 클래스 자체 :

    ClassName.methodname
    

    클래스는 인스턴스가 아니라 전달됩니다.

    좋습니다, 기억해야 할 중요한 것은 __init__ 메쏘드는 어떤 사람들에 의해 "마술"이라고 불리는 것입니다. 따라서 새 인스턴스를 생성하기 위해 전달되는 것에 대해 걱정하지 마십시오. 솔직히 말해서 아마 그럴 필요는 없습니다.

  7. ==============================

    7."self"가 존재하는 이유는 관습에 따라 Python 런타임이 Object.Method (Param1, Param2) 형식의 호출을 볼 때 매개 변수 (Object, Param1, Param2)가있는 Method를 호출한다는 것입니다. 따라서 첫 번째 매개 변수를 "self"라고하면 모든 사람이 자신이 말하는 것을 알게됩니다.

    "self"가 존재하는 이유는 관습에 따라 Python 런타임이 Object.Method (Param1, Param2) 형식의 호출을 볼 때 매개 변수 (Object, Param1, Param2)가있는 Method를 호출한다는 것입니다. 따라서 첫 번째 매개 변수를 "self"라고하면 모든 사람이 자신이 말하는 것을 알게됩니다.

    이렇게해야하는 이유는 다른 질문의 주제입니다.

    메타 클래스에 관해서는 거의 사용되지 않습니다. 다음 내용을 살펴보십시오. http://python-history.blogspot.com/2009/04/metaclasses-and-extension-classes-aka.html, 파이썬의 원저자이자 현재의 자비로운 독재자는 이것이 무엇인지, 어떻게 생겼는지 설명합니다 . 그는 또한 몇 가지 가능한 사용법에 대한 좋은 기사를 가지고 있지만, 대부분의 사람들은 결코 그것을 전혀 사용하지 않습니다.

  8. ==============================

    8.self는 클래스의 인스턴스를 참조합니다.

    self는 클래스의 인스턴스를 참조합니다.

  9. from https://stackoverflow.com/questions/6990099/explaining-the-python-self-variable-to-a-beginner by cc-by-sa and MIT license