TypeError: পদ্ধতি () 1 অবস্থানগত আর্গুমেন্ট নেয় তবে 2 দেওয়া হয়েছিল


269

আমার যদি ক্লাস থাকে ...

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)

... পাইথন আমাকে কেন বলে যে আমি এটি দুটি যুক্তি দিয়েছিলাম, যখন আমি কেবল একটি দিয়েছিলাম?


এই বার্তার অনেকগুলি কারণ রয়েছে; এখানে সুনির্দিষ্ট কারণ হ'ল সমস্ত উদাহরণ পদ্ধতি প্রথমে একটি আর্গ আশা করে যা কাস্টম অনুসারে আমরা কল করি self। সুতরাং ঘোষণা def method(arg):কোনও পদ্ধতির জন্য ভুল, এটি হওয়া উচিত def method(self, arg):। যখন পদ্ধতি প্রেরণটি কল করার জন্য method(arg):এবং এর self, argবিপরীতে দুটি পরামিতি মেলে দেখার চেষ্টা করে, আপনি সেই ত্রুটি পান।
smci

উত্তর:


366

পাইথনে, এটি:

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

মাঝেমধ্যে (কিন্তু প্রায়ই নয়), আপনি কি সত্যিই না বস্তু আপনার পদ্ধতি আবদ্ধ হয় যত্ন সম্পর্কে, এবং যে পরিস্থিতিতে, আপনি করতে পারেন সাজাইয়া রাখা builtin সঙ্গে পদ্ধতি staticmethod()ফাংশন তাই বলে:

class MyOtherClass:

    @staticmethod
    def method(arg):
        print(arg)

... এই ক্ষেত্রে আপনাকে selfপদ্ধতির সংজ্ঞায় কোনও যুক্তি যুক্ত করার প্রয়োজন হবে না এবং এটি এখনও কার্যকর হয়:

>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo

99
সংক্ষেপে: selfপদ্ধতিতে প্রথম যুক্তি হিসাবে যুক্ত করা সমস্যার সমাধান করে।
অ্যামিবি

@ আমোবে - আমার ধরণের ব্যক্তি
কার্লোস

21

এই ধরণের ত্রুটি দেখা দিলে অন্য কিছু বিবেচনা করা উচিত:

আমি এই ত্রুটি বার্তায় চলেছিলাম এবং এই পোস্টটিকে সহায়ক বলে মনে করি। আমার ক্ষেত্রে দেখা যাচ্ছে যে আমি __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

পাইচার্ম এই টাইপটি ধরেনি। বা নোটপ্যাড ++ (অন্যান্য সম্পাদক / আইডিইর শক্তিমান) নেই।

মঞ্জুর, এটি একটি "কোনও প্যারামিটার নেয় না" টাইপ এরির, পাইথনের অবজেক্ট ইনিশিয়ালেশনের ক্ষেত্রে এটি প্রত্যাশার ক্ষেত্রে "দুটি পেয়েছি" এর চেয়ে অনেক বেশি আলাদা নয়।

বিষয়টিকে সম্বোধন করা: সিনট্যাক্টিক্যালি সঠিকভাবে একটি ওভারলোডিং ইনিশিয়ালাইজার ব্যবহার করা হবে তবে তা যদি না উপেক্ষা করা হয় এবং পরিবর্তে বিল্ট-ইন ব্যবহার করা হবে। অবজেক্টটি এটি আশা / হ্যান্ডেল করবে না এবং ত্রুটি নিক্ষেপ করা হবে।

সিট্যাক্স ত্রুটির ক্ষেত্রে: ফিক্সটি সহজ, কেবল কাস্টম আরডি স্টেটমেন্টটি সম্পাদনা করুন:

def __init__(self, name):
    self.name = name

1
এখানে নেই SyntaxError। কোডটি সিন্টেক্সিকভাবে সঠিক; এটি ঠিক একটি নামকরণের পদ্ধতিটি সঠিকভাবে সংজ্ঞায়িত করে ___init__, যা বিশেষ পদ্ধতির পরিবর্তে কখনও কল করে না __init__। এজন্য কোনও ত্রুটি সনাক্ত করা যায় নি — কারণ সনাক্ত করার মতো একটি নেই।
২ar

14

সহজ কথায়।

পাইথনে আপনার selfক্লাসে সমস্ত সংজ্ঞায়িত পদ্ধতিতে প্রথম যুক্তি হিসাবে যুক্তি যুক্ত করা উচিত :

class MyClass:
  def method(self, arg):
    print(arg)

তারপরে আপনি নিজের স্বীকৃতি অনুসারে আপনার পদ্ধতিটি ব্যবহার করতে পারেন:

>>> my_object = MyClass()
>>> my_object.method("foo")
foo

এটা আপনার সমস্যা সমাধান করবে :)

আরও ভাল বোঝার জন্য, আপনি এই প্রশ্নের উত্তরগুলিও পড়তে পারেন: স্ব-উদ্দেশ্য কী?


2
এই উত্তরটিতে কী দোষ আছে? কেন কেউ তাকে একটি নেতিবাচক পয়েন্ট দিলেন? সর্বোপরি, এটি প্রশ্নের উত্তর এবং অন্যান্য উত্তরের তুলনায় এর সরলতার দ্বারা পৃথক করা হয়েছে, যা উত্তর খুঁজতে চাইছেন এমন কিছু ব্যক্তির পক্ষে গুরুত্বপূর্ণ হতে পারে। তাই না?
সিংহুমিলিকো

10

পাইথনের আগন্তুক, আমি যখন পাইথনের **বৈশিষ্ট্যটি ভুল উপায়ে ব্যবহার করছিলাম তখন আমার এই সমস্যাটি ছিল । কোথাও থেকে এই সংজ্ঞাটি কল করার চেষ্টা করছেন:

def create_properties_frame(self, parent, **kwargs):

ডাবল স্টার ছাড়াই কল ব্যবহার করা সমস্যা তৈরি করছিল:

self.create_properties_frame(frame, kw_gsp)

প্রকারের ত্রুটি: create_properties_frame () 2 টি স্থায়ী আর্গুমেন্ট নেয় তবে 3 দেওয়া হয়েছিল

সমাধানটি **যুক্তিতে যুক্ত করা:

self.create_properties_frame(frame, **kw_gsp)

1
জাভাস্ক্রিপ্ট থেকে আগত, আমি যুক্তি হিসাবে একটি তালিকা বা অভিধান পাস করতে সক্ষম হবে বলে আশা করি। তবে দেখে মনে হচ্ছে পাইথন কীভাবে কাজ করে না: আপনাকে * বা ** দিয়ে তালিকাটি তৈরি করতে হবে, পরবর্তীটি কীওয়ার্ড যুক্তিযুক্ত তালিকার জন্য।
ছোট মস্তিষ্ক

1
@ লিটলব্রেন: হ্যাঁ আপনি যদি কোনও ফাংশনটির ভিতরে তালিকা (/ ডিক) হিসাবে বিবেচনা করতে চান তবে আপনি একটি তালিকা (বা ডিক) পাস করতে পারেন। তবে যদি আপনি তাদের পৃথক মানগুলি প্যাক করা এবং ফাংশনে আরগস (/ কাওয়ার্গস) এর সাথে মিলে যায় তবে আপনার *args(/ **kwargs) বাক্য গঠন প্রয়োজন।
smci

9

এটি তখন ঘটে যখন আপনি প্যারামিটারগুলির কোনও __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")

আপনি যখন উপরের প্রোগ্রামটি চালান, এটি আপনাকে এর মতো একটি ত্রুটি দেয়:

প্রকারের ত্রুটি: __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))

1

আপনার আসলে একটি ক্লাস তৈরি করা উচিত:

class accum:
    def __init__(self):
        self.acc = 0
    def accumulator(self, var2add, end):
        if not end:
            self.acc+=var2add
    return self.acc

0

আমার ক্ষেত্রে, আমি যুক্ত করতে ভুলে গেছি ()

আমি পদ্ধতিটি এভাবে কল করছিলাম

obj = className.myMethod

তবে এটি হওয়া উচিত

obj = className.myMethod()

-1

এই সমস্যাটি সমাধান করতে clsপ্যারামিটারটি পাস করুন @classmethod

@classmethod
def test(cls):
    return ''
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.