programing

바인딩되지 않은 메서드 f ()은(대신 classobj 인스턴스를 받았음) fibo_instance를 첫 번째 인수로 호출해야 합니다.

powerit 2023. 10. 20. 14:50
반응형

바인딩되지 않은 메서드 f ()은(대신 classobj 인스턴스를 받았음) fibo_instance를 첫 번째 인수로 호출해야 합니다.

Python에서 클래스에서 메서드를 실행하려고 하면 오류가 발생합니다.

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로 인해 실패합니다. 메소드를 정적으로 실행할 수 있도록 메소드를 정적으로 만들거나, 메소드를 실행하기 위해 인스턴스를 가질 수 있도록 클래스를 인스턴스화합니다.

메소드를 정적인 방식으로 실행하려는 것 같습니다. 이렇게 하십시오.

>>> 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클래스 인스턴스가 있을 때 자동으로 "bound"됩니다.

f는 (instance) 메서드입니다.그러나, 당신은 그것을 다음을 통해 전화하고 있습니다.fibo.f,어디에fibo클래스 개체입니다.이런 이유로,fUnbound(어떠한 클래스 인스턴스에도 바인딩되지 않음).

그랬다면

a = fibo()
a.f()

그 다음에f(인스턴스에) 바인딩되어 있습니다.a).

파이썬 2에서 (3은 구문이 다릅니다):

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

사용하다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')
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`. 

파이썬 수업을 시작하기 위한 좋은 튜토리얼이 있습니다.

In python 2 버전과 3 버전의 차이점:

이름이 같은 클래스에 기본 메서드가 이미 있는 경우 동일한 이름으로 다시 선언하면 인스턴스화할 때 해당 클래스 인스턴스의 Unbound-method 호출로 나타납니다.

클래스 메소드를 원했지만 대신 인스턴스 메소드로 선언한 경우

인스턴스 메서드는 클래스의 인스턴스를 만들 때 사용되는 메서드입니다.

예를 들면 다음과 같습니다.

   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"

python 2 버전과 3 버전은 python 3에서 쓰기 위한 class @class method가 다르므로 자동적으로 class-label method로 얻을 수 있고 @class method를 쓸 필요가 없습니다. 이것이 당신에게 도움이 될 것이라고 생각합니다.

이거 먹어봐요.python 2.7.12의 경우 생성자를 정의하거나 개체라는 클래스의 인스턴스를 정의한 후 각 메서드에 self를 추가해야 합니다.

import cv2

class calculator:

#   def __init__(self):

def multiply(self, a, b):
    x= a*b
    print(x)

def subtract(self, a,b):
    x = a-b
    print(x)

def add(self, a,b):
    x = a+b
    print(x)

def div(self, a,b):
    x = a/b
    print(x)

 calc = calculator()
 calc.multiply(2,3)
 calc.add(2,3)
 calc.div(10,5)
 calc.subtract(2,3)

언급URL : https://stackoverflow.com/questions/4473184/unbound-method-f-must-be-called-with-fibo-instance-as-first-argument-got-cla

반응형