[python] 언 바운드 메소드 f ()는 fibo_ 인스턴스를 첫 번째 인수로 사용하여 호출해야합니다 (대신 classobj 인스턴스를 가져옴)

파이썬에서 클래스에서 메소드를 실행하려고하는데 오류가 발생합니다.

Traceback (most recent call last):
  File "C:\Users\domenico\Desktop\py\main.py", line 8, in <module>
    fibo.f()
  TypeError: unbound method f() must be called with fibo instance 
  as first argument (got nothing instead)

코드 : (swineflu.py)

class fibo:
    a=0
    b=0

    def f(self,a=0):
        print fibo.b+a
        b=a;
        return self(a+1)

스크립트 main.py

import swineflu

f = swineflu
fibo = f.fibo

fibo.f()            #TypeError is thrown here

이 오류는 무엇을 의미합니까? 이 오류의 원인은 무엇입니까?



답변

우선, 다른 이름으로 모듈에 대한 참조를 얻을 필요는 없습니다. 이미의 참조가 있고 import사용할 수 있습니다. 다른 이름을 원하면을 사용하십시오 import swineflu as f.

둘째, 클래스를 인스턴스화하지 않고 클래스에 대한 참조를 얻습니다.

따라서 다음과 같아야합니다.

import swineflu

fibo = swineflu.fibo()  # get an instance of the class
fibo.f()                # call the method f of the instance

결합 방법은 개체의 인스턴스에 부착되는 것이다. 언 바운드 방법은 물론, 하나 되지 인스턴스에 연결합니다. 오류는 일반적으로 인스턴스가 아닌 클래스에서 메서드를 호출한다는 것을 의미합니다.이 경우 클래스를 인스턴스화하지 않았기 때문에이 상황이 정확히 발생합니다.


답변

가능한 적은 줄로이 오류를 재현하는 방법 :

>>> class C:
...   def f(self):
...     print "hi"
...
>>> C.f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with C instance as
first argument (got nothing instead)

클래스를 먼저 인스턴스화하지 않았기 때문에 TypeError 때문에 실패합니다 .1 : 메소드를 정적 방식으로 실행하여 정적 방식으로 실행할 수 있습니다. 메소드를 실행합니다.

정적 방법으로 메소드를 실행하려는 것처럼 보입니다.

>>> class C:
...   @staticmethod
...   def f():
...     print "hi"
...
>>> C.f()
hi

또는 아마도 의미는 인스턴스화 된 인스턴스를 다음과 같이 사용하는 것입니다.

>>> class C:
...   def f(self):
...     print "hi"
...
>>> c1 = C()
>>> c1.f()
hi
>>> C().f()
hi

이것이 혼란 스러우면 다음과 같은 질문을하십시오.

  1. 정적 메소드의 동작과 일반 메소드의 동작의 차이점은 무엇입니까?
  2. 클래스를 인스턴스화한다는 것은 무엇을 의미합니까?
  3. 정적 메소드 실행 방법과 일반 메소드의 차이점
  4. 클래스와 객체의 차이점

답변

fibo = f.fibo클래스 자체를 참조합니다. 클래스 의 인스턴스fibo = f.fibo() 를 만들고 싶을 때 (괄호를 참고하십시오) 그 후에 올바르게 성공해야합니다.fibo.f()

f.fibo.f()기본적으로 f(self, a=0)공급하지 않고 전화하기 때문에 실패합니다 self. self클래스의 인스턴스가 있으면 자동으로 “바운드”됩니다.


답변

f(인스턴스) 방법입니다. 그러나 클래스 객체가있는 fibo.f곳을 통해 호출 fibo합니다. 따라서 f바인딩되지 않습니다 (클래스 인스턴스에 바인딩되지 않음).

네가했다면

a = fibo()
a.f()

그런 다음 f(인스턴스에 a) 바인딩 됩니다.


답변

import swineflu

x = swineflu.fibo()   # create an object `x` of class `fibo`, an instance of the class
x.f()                 # call the method `f()`, bound to `x`. 

다음 은 Python에서 클래스를 시작하는 데 유용한 자습서입니다.


답변

Python 2에서 (3은 다른 구문을 가짐) :

메소드 중 하나를 호출하기 전에 Parent 클래스를 인스턴스화 할 수 없으면 어떻게합니까?

super(ChildClass, self).method()부모 메소드에 액세스하는 데 사용 합니다.

class ParentClass(object):
    def method_to_call(self, arg_1):
        print arg_1

class ChildClass(ParentClass):
    def do_thing(self):
        super(ChildClass, self).method_to_call('my arg')


답변

Python 2 및 3 버전의 차이점 :

동일한 이름을 가진 클래스에 이미 기본 메소드가 있고 동일한 이름으로 다시 선언 한 경우 인스턴스화하려고 할 때 해당 클래스 인스턴스의 바인딩되지 않은 메소드 호출로 나타납니다.

클래스 메소드를 원했지만 대신 인스턴스 메소드로 선언했습니다.

인스턴스 메소드는 클래스의 인스턴스를 작성할 때 사용되는 메소드입니다.

예를 들면

   def user_group(self):   #This is an instance method
        return "instance method returning group"

클래스 라벨 방법 :

   @classmethod
   def user_group(groups):   #This is an class-label method
        return "class method returning group"

파이썬 2와 3 버전에서는 @classmethod 클래스가 다르므로 파이썬 3으로 작성하면 자동으로 클래스 레이블 메소드로 가져 와서 @classmethod를 작성할 필요가 없습니다. 이것이 도움이 될 것이라고 생각합니다.