수업이 있다면 …
class MyClass:
def method(arg):
print(arg)
… 객체를 만드는 데 사용합니다 …
my_object = MyClass()
… 내가 method("foo")
그렇게 부르는 …
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
… 파이썬이 왜 하나만 주었을 때 두 가지 주장을했다고 말합니까?
답변
파이썬에서 이것은 :
my_object.method("foo")
… 통역사가 장면 뒤에서 다음과 같이 해석하는 구문 설탕입니다 .
MyClass.method(my_object, "foo")
… 보시다시피, 실제로 두 가지 주장이 있습니다. 발신자의 관점에서 볼 때 첫 번째 주장은 암시 적입니다.
이것은 대부분의 메소드가 호출 된 오브젝트에 대해 일부 작업을 수행하기 때문에 메소드 내에서 해당 오브젝트를 참조 할 수있는 방법이 필요하기 때문입니다. 일반적으로이 첫 번째 인수는 self
메소드 정의 안에서 호출 됩니다.
class MyNewClass:
def method(self, arg):
print(self)
print(arg)
method("foo")
의 인스턴스 를 호출하면 MyNewClass
예상대로 작동합니다.
>>> my_new_object = MyNewClass()
>>> my_new_object.method("foo")
<__main__.MyNewClass object at 0x29045d0>
foo
간혹 (빈번하지는 않지만) 메서드가 바인딩 된 개체에 대해서는 신경 쓰지 않으며 , 그런 경우 에는 내장 함수로 메서드를 장식 하여 다음과 같이 staticmethod()
말할 수 있습니다.
class MyOtherClass:
@staticmethod
def method(arg):
print(arg)
…이 경우 self
메소드 정의에 인수를 추가 할 필요가 없으며 여전히 작동합니다.
>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo
답변
이 유형의 오류가 발생했을 때 고려해야 할 사항 :
이 오류 메시지가 표시되어이 게시물이 도움이되었다는 것을 알았습니다. 제 경우 __init__()
에는 객체 상속이 있는 곳 을 재정의했습니다 .
상속 된 예제는 다소 길기 때문에 상속을 사용하지 않는 더 간단한 예제로 건너 뛸 것입니다.
class MyBadInitClass:
def ___init__(self, name):
self.name = name
def name_foo(self, arg):
print(self)
print(arg)
print("My name is", self.name)
class MyNewClass:
def new_foo(self, arg):
print(self)
print(arg)
my_new_object = MyNewClass()
my_new_object.new_foo("NewFoo")
my_bad_init_object = MyBadInitClass(name="Test Name")
my_bad_init_object.name_foo("name foo")
결과는 다음과 같습니다
<__main__.MyNewClass object at 0x033C48D0>
NewFoo
Traceback (most recent call last):
File "C:/Users/Orange/PycharmProjects/Chapter9/bad_init_example.py", line 41, in <module>
my_bad_init_object = MyBadInitClass(name="Test Name")
TypeError: object() takes no parameters
PyCharm은이 오타를 잡지 못했습니다. 메모장 ++도 (다른 편집자 / IDE의 경우도) 아닙니다.
물론 이것은 “매개 변수 없음”TypeError이며, 파이썬에서 객체 초기화 측면에서 하나를 기대할 때 “두 개를 얻는 것”과 크게 다르지 않습니다.
주제 해결 : 구문 상으로 올 바르면 오버로딩 이니셜 라이저가 사용되지만 그렇지 않으면 무시되고 내장 기능이 대신 사용됩니다. 객체는 이것을 예상 / 처리하지 않으며 오류가 발생합니다.
sytax 오류의 경우 : 수정은 간단합니다. 사용자 정의 init 문을 편집하십시오.
def __init__(self, name):
self.name = name
답변
간단히 말해서.
파이썬에서는 self
클래스의 모든 정의 된 메소드에 인수를 첫 번째 인수로 추가해야합니다 .
class MyClass:
def method(self, arg):
print(arg)
그런 다음 직감에 따라 방법을 사용할 수 있습니다.
>>> my_object = MyClass()
>>> my_object.method("foo")
foo
이것은 당신의 문제를 해결해야합니다 🙂
이해를 돕기 위해이 질문에 대한 답을 읽을 수도 있습니다. 자기의 목적은 무엇입니까?
답변
파이썬을 처음 접했을 때 파이썬의 **
기능을 잘못 사용했을 때이 문제가 발생했습니다 . 어딘가 에서이 정의를 호출하려고합니다.
def create_properties_frame(self, parent, **kwargs):
이중 별표없이 통화를 사용하면 문제가 발생했습니다.
self.create_properties_frame(frame, kw_gsp)
typeError : create_properties_frame ()은 2 개의 위치 인수를 취하지 만 3이 주어졌습니다
해결책은 **
인수 에 추가 하는 것입니다.
self.create_properties_frame(frame, **kw_gsp)
답변
매개 변수 __init__()
또는 다른 방법으로 찾을 매개 변수를 지정하지 않으면 발생합니다 .
예를 들면 다음과 같습니다.
class Dog:
def __init__(self):
print("IN INIT METHOD")
def __unicode__(self,):
print("IN UNICODE METHOD")
def __str__(self):
print("IN STR METHOD")
obj=Dog("JIMMY",1,2,3,"WOOF")
위의 프로그램을 실행하면 다음과 같은 오류가 발생합니다.
TypeError : __init __ ()은 1 개의 위치 인수를 취하지 만 6이 주어졌습니다
우리는 어떻게이 일을 제거 할 수 있습니까?
그냥 무엇을, 매개 변수를 전달할 __init__()
찾는 방법
class Dog:
def __init__(self, dogname, dob_d, dob_m, dob_y, dogSpeakText):
self.name_of_dog = dogname
self.date_of_birth = dob_d
self.month_of_birth = dob_m
self.year_of_birth = dob_y
self.sound_it_make = dogSpeakText
def __unicode__(self, ):
print("IN UNICODE METHOD")
def __str__(self):
print("IN STR METHOD")
obj = Dog("JIMMY", 1, 2, 3, "WOOF")
print(id(obj))
답변
실제로 클래스를 작성해야합니다.
class accum:
def __init__(self):
self.acc = 0
def accumulator(self, var2add, end):
if not end:
self.acc+=var2add
return self.acc
답변
제 경우에는 추가하는 것을 잊었습니다 ()
나는 이런 방법으로 전화했다
obj = className.myMethod
하지만 이렇게해야합니다
obj = className.myMethod()