আনবাউন্ড মেথড চ () অবশ্যই প্রথম যুক্তি হিসাবে ফাইবো_ উদাহরণ সহ কল ​​করা উচিত (পরিবর্তে শ্রেণিবোজের উদাহরণ পেল)


139

পাইথনে, আমি একটি ক্লাসে একটি পদ্ধতি চালানোর চেষ্টা করছি এবং আমি একটি ত্রুটি পেয়েছি:

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)

স্ক্রিপ্ট প্রধান.পি

import swineflu

f = swineflu
fibo = f.fibo

fibo.f()            #TypeError is thrown here

এই সমস্যার মানে কি? কী কারণে এই ত্রুটি ঘটছে?


1
আপনি কি কোনও জিনিস ইনস্ট্যান্ট করতে চান না?
থমাস

2
শ্রেণীর নাম মূলধন করা উচিত।
সিডিটি

1
fibo = f.fibo()বন্ধনীর সাহায্যে ক্লাসটি ইনস্ট্যান্ট করা দরকার।
কোটলিনবয়

আপনি ব্যবহার করতে পারেনfibo().f()
বেনিয়ামিন জাফারি

উত্তর:


179

ঠিক আছে, সবার আগে, আপনাকে মডিউলের কোনও আলাদা নামে রেফারেন্স নিতে হবে না; আপনার ইতিমধ্যে একটি রেফারেন্স রয়েছে (থেকে 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

একটি আবদ্ধ পদ্ধতি হ'ল একটি বস্তুর উদাহরণের সাথে সংযুক্ত। একটি আনবাউন্ড পদ্ধতি অবশ্যই একটি এটি যা উদাহরণের সাথে সংযুক্ত নয় । ত্রুটিটির অর্থ সাধারণত আপনি ক্লাসে পদ্ধতিটি কল করে যাচ্ছেন কোনও উদাহরণের পরিবর্তে, যা ঠিক এই ক্ষেত্রে ঘটছে কারণ আপনি ক্লাসটি ইনস্ট্যান্ট করেননি।


1
আপনি swineflu.fibo().f()কেবল একবার কল করে থাকলে আপনিও করতে পারেন।
কিট

81

যতটা সম্ভব কম লাইন দিয়ে এই ত্রুটিটি পুনরুত্পাদন করবেন:

>>> 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)

এটি টাইপআরারের কারণে ব্যর্থ হয় কারণ আপনি প্রথমে ক্লাসটি ইনস্ট্যান্ট করেননি, আপনার দুটি পছন্দ আছে: 1: হয় পদ্ধতিটিকে স্ট্যাটিক করুন যাতে আপনি এটি একটি স্ট্যাটিক উপায়ে চালাতে পারেন, বা 2: আপনার ক্লাসটি ইনস্ট্যান্ট করুন যাতে আপনার দখলের উদাহরণ রয়েছে উপর, পদ্ধতি চালাতে।

দেখে মনে হচ্ছে আপনি একটি স্ট্যাটিক পদ্ধতিতে পদ্ধতিটি চালাতে চান, এটি করুন:

>>> 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. শ্রেণি এবং বস্তুর মধ্যে পার্থক্য।

আমি আমার ক্লাসটি ইনস্ট্যান্ট করেছি তবে এটি কেবল তখনই কার্যকর হয় যখন আমি @ স্ট্যাটিকমেডথ ব্যবহার করি। তা কি ব্যাখ্যা করা যায়?
abeltre1

9

fibo = f.fiboক্লাস নিজেই রেফারেন্স। আপনি সম্ভবত ক্লাসের একটি উদাহরণ তৈরি fibo = f.fibo()করতে চান (প্রথম বন্ধনীগুলি নোট করুন) , এর পরে সঠিকভাবে সফল হওয়া উচিত।fibo.f()

f.fibo.f()ব্যর্থ হয় কারণ আপনি f(self, a=0)সরবরাহ না করে মূলত কল করছেন self; selfআপনার কাছে ক্লাসের উদাহরণ থাকলে স্বয়ংক্রিয়ভাবে "আবদ্ধ" হয়।


4

fএকটি (উদাহরণ) পদ্ধতি। যাইহোক, আপনি এটি মাধ্যমে কল করছেন, ক্লাস অবজেক্টটি fibo.fকোথায় fibo। সুতরাং, fআনবাউন্ড (কোনও শ্রেণীর উদাহরণের সাথে আবদ্ধ নয়)।

যদি তুমি কর

a = fibo()
a.f()

তারপরে এটি fআবদ্ধ (উদাহরণস্বরূপ a)।


2
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`. 

পাইথনের ক্লাস শুরু করার জন্য এখানে একটি ভাল টিউটোরিয়াল।


2

পাইথন 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')

0

পাইথন 2 এবং 3 সংস্করণে পার্থক্য:

আপনার যদি ইতিমধ্যে একই নামে ক্লাসে একটি ডিফল্ট পদ্ধতি থাকে এবং আপনি একই নামে পুনরায় ঘোষণা করেন এটি যখন আপনি ইনস্ট্যান্ট করতে চেয়েছিলেন তখন সেই শ্রেণীর উদাহরণের আনবাউন্ড-পদ্ধতি কল হিসাবে উপস্থিত হবে।

আপনি যদি শ্রেণিবদ্ধ পদ্ধতি চাইতেন তবে পরিবর্তে আপনি এগুলি উদাহরণ পদ্ধতি হিসাবে ঘোষণা করেছিলেন।

একটি উদাহরণ পদ্ধতি এমন একটি পদ্ধতি যা শ্রেণীর উদাহরণ তৈরি করার সময় ব্যবহৃত হয়।

একটি উদাহরণ হবে

   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"

পাইথন 2 এবং 3 সংস্করণে ক্লাস লেবেল পদ্ধতি হিসাবে ক্লাস লেবেল পদ্ধতি হিসাবে ক্লাস @ গণিত ক্লাসটি পৃথক হয়ে যায় এবং এটি ক্লাস-লেবেল পদ্ধতি হিসাবে লেখার প্রয়োজন হয় না এবং আমার মনে হয় এটি আপনাকে সাহায্য করতে পারে বলে ক্লাসমেডোবাদী লেখেন I


0

এটা চেষ্টা কর. পাইথন ২.7.১২ এর জন্য আমাদের কনস্ট্রাক্টরকে সংজ্ঞায়িত করতে হবে বা প্রতিটি পদ্ধতির সাথে নিজেকে যুক্ত করতে হবে যারপরে অবজেক্ট নামক শ্রেণীর উদাহরণ সংজ্ঞায়িত করতে হবে।

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.