바인딩되지 않은 메서드 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
이 문제로 혼란스러운 경우 다음과 같은 질문을 하십시오.
- 정태적 방법의 행동과 정상적 방법의 행동의 차이가 있습니까?
- 수업을 인스턴스화한다는 것은 무엇을 의미합니까?
- 정적 방법 실행 방식과 일반 방법 간의 차이.
- 클래스와 개체 간의 차이.
fibo = f.fibo
클래스 자체를 참조합니다.당신은 아마도 당신이 원했을 것입니다.fibo = f.fibo()
(괄호 참조) 클래스의 인스턴스를 만들고, 그 후에fibo.f()
올바르게 성공해야 합니다.
f.fibo.f()
기본적으로 전화를 걸었기 때문에 실패합니다.f(self, a=0)
무급으로self
;self
클래스 인스턴스가 있을 때 자동으로 "bound"됩니다.
f
는 (instance) 메서드입니다.그러나, 당신은 그것을 다음을 통해 전화하고 있습니다.fibo.f
,어디에fibo
클래스 개체입니다.이런 이유로,f
Unbound(어떠한 클래스 인스턴스에도 바인딩되지 않음).
그랬다면
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
'programing' 카테고리의 다른 글
템플릿이 존재하지 않음 - Django 오류 (0) | 2023.10.20 |
---|---|
커서 잡기(드래그 & 드롭)를 위한 CSS (0) | 2023.10.20 |
MariaDB: 저장 프로시저 잠금 행에서 SELECT (0) | 2023.10.20 |
스크립트를 사용하여 이미지 캐시하기 (0) | 2023.10.20 |
PANDS의 SQL-like window 함수: Python Pandas Dataframe의 Row Numbering (0) | 2023.10.20 |