私はクラスがありますか...
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)
...なぜPythonが2つの引数を与えたのですか。
Pythonでは、これは
my_object.method("foo")
...は 構文糖 です。これは、インタプリタが舞台裏で次のように変換します。
MyClass.method(my_object, "foo")
お分かりのように、これは2つの引数を持っています - 呼び出し側から見れば、最初の引数が暗黙的であるということだけです。
これは、ほとんどのメソッドが呼び出されたオブジェクトに対して何らかの処理を行うため、そのオブジェクトをメソッド内で参照するための何らかの方法が必要であるためです。慣例により、この最初の引数はメソッド定義内でself
と呼ばれます。
class MyNewClass:
def method(self, arg):
print(self)
print(arg)
MyNewClass
のインスタンスでmethod("foo")
を呼び出しても、期待通りに動作します。
>>> my_new_object = MyNewClass()
>>> my_new_object.method("foo")
<__main__.MyNewClass object at 0x29045d0>
foo
ときどき(しかし頻繁にではありません)、あなたはあなたのメソッドがバインドされているオブジェクトについて本当に しないで 気にします、そしてその状況ではあなたは decorate 組み込みメソッド staticmethod()
function)そう言うために:
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はこのタイプミスを見つけませんでした。 Notepad ++(他のエディタ/ IDEの人たちも)はそうではありませんでした。
確かに、これは「引数を取らない」TypeErrorです。Pythonでのオブジェクトの初期化に関しては、期待される場合の「取得された2」と大差ありません。
トピックへの対処:構文的に正しい場合はオーバーロードイニシャライザが使用されますが、正しくない場合は無視され、代わりに組み込みコマンドが使用されます。オブジェクトはこれを期待/処理せず、エラーがスローされます。
Sytaxエラーの場合:修正は簡単です。カスタムinitステートメントを編集するだけです。
def __init__(self, name):
self.name = name
init ()や他の探しているパラメータのnoを指定しなかった場合に起こります。
例えば
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つは与えられました
どのように我々はこのことを取り除くことができますか?
パラメータを渡すだけで、what 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))
Pythonの初心者で、Pythonの**
機能を間違った方法で使用していたときにこの問題が発生しました。どこかからこの定義を呼び出そうとしています:
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)