programing

self 파라미터의 목적은 무엇입니까?왜 그것이 필요합니까?

stoneblock 2023. 4. 29. 08:14

self 파라미터의 목적은 무엇입니까?왜 그것이 필요합니까?

이 예를 고려해 보십시오.

class MyClass:
    def func(self, name):
        self.name = name

나는 그것을 알고 있습니다.self는 인스참를조다니합스턴의의 .MyClass하지만 왜 그래야 합니까?func으로 명적으포다니를 포함합니다.self매개 변수로?사용해야 하는 이유self그 방법의 코드에?일부 다른 언어는 이를 암시적으로 만들거나 특수 구문을 대신 사용합니다.


설계 결정에 대한 언어에 구애받지 않는 고려사항은 이/자체 포인터를 필수적으로 명시적으로 사용할 경우의 이점을 참조하십시오.

OP가 생략한 디버깅 질문을 닫으려면self메서드에 대한 매개 변수 및 got aTypeErroruseTypeError: method()는 1개의 위치 인수를 사용하지만 대신 2개가 지정되었습니다.OP가 생략된 경우self.방법의 본문에서 그리고 a를 얻었습니다.NameError클래스 내에서 함수를 호출하려면 어떻게 해야 합니까?

를 사용해야 하는 이.self.이는 Python이 인스턴스 특성을 참조하기 위해 특수 구문을 사용하지 않기 때문입니다.Python은 메서드가 속한 인스턴스가 자동으로 전달되지만 자동으로 수신되지 않는 방식으로 메서드를 수행하기로 결정했습니다. 메서드의 첫 번째 매개 변수는 메서드가 호출되는 인스턴스입니다.이렇게 하면 메서드가 함수와 완전히 동일해지고 실제 이름은 사용자에게 맡겨집니다.self관례에 따르면, 사람들은 일반적으로 당신이 다른 것을 사용할 때 당신에게 눈살을 찌푸릴 것입니다.) self코드에 특별한 것이 아니라 다른 객체일 뿐입니다.

Python은 일반 이름과 속성을 구별하기 위해 다른 방법을 사용할 수도 있었습니다. Ruby와 같은 특별한 구문이나 C++와 Java와 같은 선언을 요구하거나 아마도 더 다른 무언가를 요구할 수도 있었습니다. 하지만 그렇지 않았습니다.Python은 모든 것을 명시적으로 만들고 무엇이 무엇인지 명확하게 하며, 어디에서나 완전히 하지는 않지만 예를 들어 속성을 위해 합니다.하는 것은 할당할 에 인턴스속할성것할인알하은당합고따야, 다니할해당라서스아를야스스턴할는에하당▁that▁to▁needs▁needs▁it▁attribute다합▁instance니▁what▁to따▁and할인▁an▁that▁assigning야스라당해▁know▁to가 필요합니다.self..

이 있다고 치자.ClassA에는 메소드 메드포있습다니어되함소가 포함되어 .methodA다음으로 정의됨:

def methodA(self, arg1, arg2):
    # do something

그리고.objectA이 클래스의 인스턴스입니다.

이제언제 때.objectA.methodA(arg1, arg2)되며, 같이 합니다.

ClassA.methodA(objectA, arg1, arg2)

self자체를 . variable은 객체 자체를 말합니다.

간단한 벡터 클래스를 살펴보겠습니다.

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

우리는 길이를 계산하는 방법을 원합니다.클래스 내부에서 정의하기를 원한다면 어떤 모습일까요?

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

글로벌 방법/기능으로 정의할 때 어떤 모습이어야 합니까?

def length_global(vector):
    return math.sqrt(vector.x ** 2 + vector.y ** 2)

그래서 전체 구조는 그대로 유지됩니다.이것을 어떻게 활용할 수 있습니까?만약 우리가 잠시 동안 우리가 편지를 쓰지 않았다고 가정한다면.length의 리를위방 .Vectorclass,을 할 수 : 업수할, 우는수있다습니:

Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0

이는 첫 번째 매개 변수가 다음과 같이 작동하기 때문입니다.length_global는 다사용수있다니습할시▁the-로 다시 할 수 .self 변수는 의매변수에 있습니다.length_new인 이은명지않으것불입다니할이 없으면 할 것입니다.self.


인 명적요이또의 하는 또 다른 은 시른방입니다.self파이썬이 어디에 구문 설탕을 첨가하는지 확인하는 것입니다.당신이 명심할 때, 그것은 기본적으로, 다음과 같은 전화입니다.

v_instance.length()

내부적으로 변환됨

Vector.length(v_instance)

어디에 있는지 보는 것은 쉽습니다.self 메소드매개 해야 하는 입니다.당신은 실제로 Python에서 인스턴스 메소드를 작성하지 않습니다. 당신이 작성하는 것은 인스턴스를 첫 번째 매개 변수로 취해야 하는 클래스 메소드입니다.따라서 인스턴스 매개 변수를 명시적으로 어딘가에 배치해야 합니다.

개체가 인스턴스화되면 개체 자체가 자체 매개 변수로 전달됩니다.

여기에 이미지 설명 입력

이로 인해 개체의 데이터가 개체에 바인딩됩니다.다음은 각 개체의 데이터 모양을 시각화하는 방법의 예입니다.'self'가 객체 이름으로 대체되는 방식에 주목합니다.아래 예시 다이어그램이 완전히 정확하다고 말하는 것은 아니지만, 바라건대 그것이 자신의 사용을 시각화하는 데 도움이 되기를 바랍니다.

여기에 이미지 설명 입력

개체가 자체 데이터를 보유할 수 있도록 개체가 자체 매개 변수로 전달됩니다.

이것이 완전히 정확한 것은 아니지만, 다음과 같은 개체를 인스턴스화하는 프로세스를 생각해 보십시오.개체를 만들 때 클래스를 자체 데이터 및 메서드의 템플릿으로 사용합니다.자체 매개 변수에 고유한 이름을 전달하지 않으면 클래스의 특성 및 메서드가 일반 템플릿으로 남아 개체에 대해 참조되지 않습니다.따라서 개체의 이름을 자체 매개 변수로 전달하면 한 클래스에서 100개의 개체가 인스턴스화되면 모든 개체가 자신의 데이터와 방법을 추적할 수 있습니다.

아래 그림을 참조하십시오.

여기에 이미지 설명 입력

다음 예가 좋습니다.

class A: 
    foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: [5]

class A: 
    def __init__(self): 
        self.foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: []

클래스를 사용하지 않는 코드로 시연합니다.

def state_init(state):
    state['field'] = 'init'

def state_add(state, x):
    state['field'] += x

def state_mult(state, x):
    state['field'] *= x

def state_getField(state):
    return state['field']

myself = {}
state_init(myself)
state_add(myself, 'added')
state_mult(myself, 2)

print( state_getField(myself) )
#--> 'initaddedinitadded'

클래스는 항상 이 "상태"에서 전달되는 것을 방지하는 방법일 뿐입니다(그리고 초기화, 클래스 구성, 거의 필요하지 않은 메타 클래스, 연산자를 재정의하는 사용자 지정 메서드 지원 등).

이제 기본적으로 동일한 기능을 보여주기 위해 내장된 파이썬 클래스 기계를 사용하여 위의 코드를 시연해 보겠습니다.

class State(object):
    def __init__(self):
        self.field = 'init'
    def add(self, x):
        self.field += x
    def mult(self, x):
        self.field *= x

s = State()
s.add('added')    # self is implicitly passed in
s.mult(2)         # self is implicitly passed in
print( s.field )

[내 대답을 중복된 비공개 질문에서 제외]

다음은 자체에 대한 Python 문서에서 발췌한 것입니다.

Modula-3에서와 같이 메서드에서 개체의 멤버를 참조하기 위한 속기가 [Python]에는 없습니다. 메서드 함수는 호출에 의해 암시적으로 제공되는 개체를 나타내는 명시적인 첫 번째 인수로 선언됩니다.

종종, 방법의 첫 번째 인수를 자아라고 합니다.이것은 관습에 지나지 않습니다. 이름 자체는 Python에게 특별한 의미가 없습니다.그러나 규약을 따르지 않음으로써 다른 Python 프로그래머가 코드를 덜 읽을 수 있으며, 그러한 규약에 의존하는 클래스 브라우저 프로그램이 작성될 수도 있습니다.

자세한 내용은 클래스에 대한 Python 설명서 튜토리얼을 참조하십시오.

로, 방법에 더 할 수 . 은 이미언급재아메정쉽된서있다수액게니습에할세스드의니라만뿐유이한다모른든;다▁as있▁call니습▁can▁you수▁allows▁already▁to▁itridden라고 부를 수 있습니다. 전화를 걸 수 있습니다.Class.some_method(inst).

유용한 부분의 예:

class C1(object):
    def __init__(self):
         print "C1 init"

class C2(C1):
    def __init__(self): #overrides C1.__init__
        print "C2 init"
        C1.__init__(self) #but we still want C1 to init the class too
>>> C2()
"C2 init"
"C1 init"

의 사용법은 의 사용법과 유사합니다.this현재 개체에 대한 참조를 제공하는 Java의 키워드입니다.

파이썬은 자바나 C++와 달리 객체 지향 프로그래밍을 위해 만들어진 언어가 아닙니다.

Python에서 정적 메서드를 호출할 때는 단순히 규칙적인 인수가 포함된 메서드를 작성합니다.

class Animal():
    def staticMethod():
        print "This is a static method"

하지만, 이 경우 동물인 변수를 만들어야 하는 객체 방법은 자체 인수가 필요합니다.

class Animal():
    def objectMethod(self):
        print "This is an object method which needs an instance of a class"

자체 메서드는 클래스 내의 변수 필드를 나타내는 데도 사용됩니다.

class Animal():
    #animalName made in constructor
    def Animal(self):
        self.animalName = "";


    def getAnimalName(self):
        return self.animalName

이 경우 self는 전체 클래스의 animalName 변수를 참조합니다.기억: 메서드 내에 변수가 있으면 자체가 작동하지 않습니다.해당 변수는 해당 메서드가 실행 중일 때만 존재합니다.필드(전체 클래스의 변수)를 정의하려면 클래스 메서드 외부에서 필드를 정의해야 합니다.

제가 말하는 것을 단 한 단어도 이해하지 못한다면, 구글 "객체 지향 프로그래밍"을 선택하십시오.일단 이것을 이해하면, 당신은 그 질문을 할 필요조차 없을 것입니다 :).

무엇보다도, 자아는 관습적인 이름이고, 여러분은 그 대신에 다른 어떤 것이든 (일관성이 있는) 것을 넣을 수 있습니다.

개체 자체를 가리키므로 개체를 사용할 때 .name 및 .age가 생성할 학생 개체(학생 클래스가 아님)의 속성임을 선언합니다.

class Student:
    #called each time you create a new Student instance
    def __init__(self,name,age): #special method to initialize
        self.name=name
        self.age=age

    def __str__(self): #special method called for example when you use print
        return "Student %s is %s years old" %(self.name,self.age)

    def call(self, msg): #silly example for custom method
        return ("Hey, %s! "+msg) %self.name

#initializing two instances of the student class
bob=Student("Bob",20)
alice=Student("Alice",19)

#using them
print bob.name
print bob.age
print alice #this one only works if you define the __str__ method
print alice.call("Come here!") #notice you don't put a value for self

#you can modify attributes, like when alice ages
alice.age=20
print alice

코드는 여기에 있습니다.

self개체 자체에 대한 개체 참조이므로 이들은 동일합니다.Python 메서드는 개체 자체의 컨텍스트에서 호출되지 않습니다. selfPython에서는 사용자 지정 객체 모델이나 다른 것을 처리하는 데 사용될 수 있습니다.

그것은 파이썬 젠을 따르기 위해 "명시적인 것이 암시적인 것보다 낫다"는 것입니다.클래스 개체에 대한 참조입니다.들어 와 PHP에서는 예를들에자 PHP서다음부다릅니같이라고 .this.

한다면user_type_name의 필드입니다. 를 수 .self.user_type_name.

아무도 루아 얘기를 꺼내지 않았다니 놀랍군요.Lua는 또한 'self' 변수를 사용하지만 생략할 수 있지만 여전히 사용됩니다.C++는 '이것'에서도 동일한 기능을 합니다.각 기능에서 '셀프'를 선언해야 할 이유는 없지만 루아와 C++과 마찬가지로 사용할 수 있어야 합니다.간결함을 자랑하는 언어의 경우, 자기 변수를 선언해야 한다는 것이 이상합니다.

전적으불인수사용의리라고 불리는 의 사용.self이해하기 어렵지 않습니다, 왜 그것이 필요한가요?아니면 왜 그것을 명시적으로 언급하는지에 대해?제 생각에, 그것은 이 질문을 찾는 대부분의 사용자들에게 더 큰 질문입니다. 그렇지 않다면, 그들은 파이썬 학습을 진행할 때 분명히 같은 질문을 할 것입니다.저는 그들에게 다음 두 개의 블로그를 읽는 것을 추천합니다.

1: 자체 설명 사용

키워드가 아닙니다.

init를 포함한 모든 클래스 메서드의 첫 번째 인수는 항상 클래스의 현재 인스턴스에 대한 참조입니다.관례에 따라 이 주장은 항상 자신의 이름으로 지정됩니다.init 메서드에서 self는 새로 생성된 개체를 가리키며, 다른 클래스 메서드에서 self는 메서드가 호출된 인스턴스를 가리킵니다.예를 들어 아래 코드는 위 코드와 동일합니다.

2: 왜 우리는 그것을 이런 식으로 사용하고, 왜 우리는 그것을 Java와 같은 인수로 제거하지 않고 대신 키워드를 가질 수 있습니까?

제가 덧붙이고 싶은 또 다른 것은, 선택 사항입니다.self인수를 사용하면 클래스 내에서 정적 메서드를 쓰지 않음으로써 선언할 수 있습니다.self.

코드 예:

class MyClass():
    def staticMethod():
        print "This is a static method"

    def objectMethod(self):
        print "This is an object method which needs an instance of a class, and that is what self refers to"

PS: 이 기능은 Python 3.x에서만 작동합니다.

버전에서는 이전버서명는추합가니다야해로으전을 .@staticmethod장식가, 그렇지 않은 경우self인수는 필수입니다.

을 명확하게 예를 . 이 예는 목적을 명확하게 설명합니다.self

class Restaurant(object):  
    bankrupt = False

    def open_branch(self):
        if not self.bankrupt:
           print("branch opened")

#create instance1
>>> x = Restaurant()
>>> x.bankrupt
False

#create instance2
>>> y = Restaurant()
>>> y.bankrupt = True   
>>> y.bankrupt
True

>>> x.bankrupt
False  

self인스턴스를 구분하는 데 사용됩니다.

출처: 파이썬의 자체 변수 설명 - 파이썬팁스

파이썬이 설계된 방식으로는 대안이 거의 작동하지 않을 것이기 때문입니다.Python은 메소드나 함수를 둘 다 암시적인 맥락에서 정의할 수 있도록 설계되었습니다.this Java 명시적 (a-la Java/C++) 파일입니다.@ruby) 않을 것입니다. (a-la ruby) 않것다니입을작동.python 규약을 사용한 명시적 접근 방식의 예를 들어 보겠습니다.

def fubar(x):
    self.x = x

class C:
    frob = fubar

이제더더.fubar기능이 작동하지 않을 것입니다. 왜냐하면 그것은 그것이self 변수 에 포함)입니다.frob할 수 있는 방법은 된 전역 범위(대은된대여글범방실것는행입하다니을법서또로위한기벌로체안여▁('것▁the(다▁method또▁scope입니where서▁a한)를 실행하는 입니다.self는 객체입니다.

암묵적 접근법은 다음과 같습니다.

def fubar(x)
    myX = x

class C:
    frob = fubar

이는 다음을 의미합니다.myX는 에로 변해니다됩석에서 로컬 됩니다.fubar (으)로)frob 은 호출변수의 하는 것입니다.여기서 대안은 호출 사이에 유지되는 대체 로컬 범위로 메소드를 실행하는 것이지만 메소드 로컬 변수의 가능성을 제거하는 것입니다.

그러나 현재 상황은 잘 해결됩니다.

 def fubar(self, x)
     self.x = x

 class C:
     frob = fubar

서 메소드로 부를 때는 메하면고라드소서기여면하▁here▁as▁called▁when고.frob호된객수니다신합체를 합니다.self변수 및 매개 변수, 및fubar여전히 객체를 매개 변수로 하여 호출할 수 있으며 동일하게 작동합니다(과 동일).C.frob그런 것 같아요.

__init__method, self는 새로 생성된 개체를 나타냅니다. 다른 클래스 메소드에서는 메서드가 호출된 인스턴스를 나타냅니다.

self는, 이름으로서, 단지 관습일 뿐입니다. 원하는 대로 부르세요! 하지만 그것을 사용할 때, 예를 들어, 객체를 삭제하기 위해, 당신은 같은 이름을 사용해야 합니다:__del__(var)서, 디에어var는 되었습니다용사에 되었습니다.__init__(var,[...])

당신은 이것을 봐야 합니다.cls그림을 갖기 위해서도. 게시물이 도움이 될 수 있습니다.

self가 현재 개체 이름 또는 클래스의 인스턴스처럼 작동합니다.

# Self explanation.


 class classname(object):

    def __init__(self,name):

        self.name=name
        # Self is acting as a replacement of object name.
        #self.name=object1.name

   def display(self):
      print("Name of the person is :",self.name)
      print("object name:",object1.name)


 object1=classname("Bucky")
 object2=classname("ford")

 object1.display()
 object2.display()

###### Output 
Name of the person is : Bucky
object name: Bucky
Name of the person is : ford
object name: Bucky

"self" 키워드는 클래스의 참조를 보유하고 있으며 사용 여부는 사용자에게 달려 있지만, 파이썬에서 새로운 메서드를 만들 때마다 파이썬은 자동으로 셀프 키워드를 작성합니다.R&D를 수행하면 클래스에서 say 두 메서드를 만들고 다른 메서드 내부에서 호출하려고 하면 자신(클래스 참조)을 추가하지 않으면 메서드를 인식하지 못합니다.

class testA:
def __init__(self):
    print('ads')
def m1(self):
    print('method 1')
    self.m2()
def m2(self):
    print('method 2')

아래 코드는 확인할 수 없는 참조 오류를 발생시킵니다.

class testA:
def __init__(self):
    print('ads')
def m1(self):
    print('method 1')
    m2()  #throws unresolvable reference error as class does not know if m2 exist in class scope
def m2(self):
    print('method 2')

이제 아래의 예를 보겠습니다.

class testA:
def __init__(self):
    print('ads')
def m1(self):
    print('method 1')
def m2():
    print('method 2')

이제 클래스 테스트 A의 객체를 만들 때 method m1()이 self 키워드를 포함했기 때문에 이와 같은 클래스 객체를 사용하여 method m1()

obj = testA()
obj.m1()

하지만 method m2()를 호출하고 싶다면, 는 자체 참조가 없기 때문에 아래와 같이 클래스 이름을 사용하여 m2()를 직접 호출할 수 있습니다.

testA.m2()

하지만 내부에 글로벌 변수를 만드는 등의 다른 이점도 있기 때문에 셀프 키워드를 사용하여 생활하는 연습을 계속하십시오.

self어쩔 수 없는 일입니다.

질문이 하나 있었습니다.self암묵적이거나 명시적입니다.Guido van Rossum 남아야 한다는 이 질문을 해결했습니다.

그서어디에래가 곳.self생방송?

한다면, 는 필요하지 않을 것입니다.selfPython OOP에 들어가면 다음과 같은 정보를 얻을 수 있습니다.self 기거.

인 활용 .class C라는 m1

class C:
    def m1(self, arg):
        print(self, ' inside')
        pass

ci =C()
print(ci, ' outside')
ci.m1(None)
print(hex(id(ci))) # hex memory address

이 프로그램은 다음을 출력합니다.

<__main__.C object at 0x000002B9D79C6CC0>  outside
<__main__.C object at 0x000002B9D79C6CC0>  inside
0x2b9d79c6cc0

그렇게self클래스 인스턴스의 메모리 주소를 보유합니다.의 목적self인스턴스 메소드에 대한 참조를 보유하고 우리가 해당 참조에 대한 명시적 액세스를 가질 수 있도록 하는 것입니다.


클래스 메서드에는 세 가지 유형이 있습니다.

  • 정적 메서드(읽기: 함수),
  • 클래스 메소드,
  • 인스턴스 메소드(앞서 언급됨)

'self'라는 단어는 클래스의 인스턴스를 의미합니다.

class foo:
      def __init__(self, num1, num2):
             self.n1 = num1 #now in this it will make the perimeter num1 and num2 access across the whole class
             self.n2 = num2
      def add(self):
             return self.n1 + self.n2 # if we had not written self then if would throw an error that n1 and n2 is not defined and we have to include self in the function's perimeter to access it's variables

클래스 인스턴스 개체에 대한 명시적인 참조입니다.

문서에서,

메서드의 특별한 점은 인스턴스 개체가 함수의 첫 번째 인수로 전달된다는 것입니다.에서는 이예서에, 통는화▁call라는 호출을 합니다.x.f()와 정확히 일치합니다.MyClass.f(x)일반적으로 n개의 인수 목록을 사용하여 메서드를 호출하는 것은 첫 번째 인수 앞에 메서드의 인스턴스 개체를 삽입하여 생성된 인수 목록을 사용하여 해당 함수를 호출하는 것과 같습니다.

이 앞에 관련된 스니펫,

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

x = MyClass()

적어도 파이썬의 경우 자체 매개 변수는 자리 표시자로 생각할 수 있습니다.이것을 확인해 보십시오.

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("John", 36)

print(p1.name)
print(p1.age)

이 경우 self와 많은 다른 것들이 이름값을 저장하는 방법으로 사용되었습니다.하지만 그 이후에는 p1을 사용하여 사용 중인 클래스에 할당합니다.그러면 우리는 그것을 인쇄할 때 같은 p1 키워드를 사용합니다.

이것이 Python에 도움이 되길 바랍니다!

나의 작은 2센트

이 클래스 사람에서, 우리는 자아와 함께 init 방법을 정의했고 여기서 주목해야 할 흥미로운 것은 자아와 인스턴스 변수 p의 기억 위치가 같다는 것입니다.<__main__.Person object at 0x106a78fd0>

class Person:

    def __init__(self, name, age):
        self.name = name 
        self.age = age 

    def say_hi(self):
        print("the self is at:", self)
        print((f"hey there, my name is {self.name} and I am {self.age} years old"))

    def say_bye(self):
        print("the self is at:", self)
        print(f"good to see you {self.name}")

p = Person("john", 78)
print("the p is at",p)
p.say_hi()  
p.say_bye() 

위에서 설명한 것처럼 self 변수와 instance 변수는 모두 동일한 개체입니다.

언급URL : https://stackoverflow.com/questions/2709821/what-is-the-purpose-of-the-self-parameter-why-is-it-needed