পাইথনে __init__ থেকে কোনও মান কীভাবে ফেরানো যায়?


105

আমার সাথে একটি ক্লাস আছে __init__ ফাংশন সহ।

যখন কোনও অবজেক্ট তৈরি হবে তখন কীভাবে আমি এই ফাংশন থেকে পূর্ণসংখ্যা মানটি ফিরিয়ে দিতে পারি?

আমি একটি প্রোগ্রাম লিখেছি, যেখানে __init__কমান্ড লাইনটি পার্সিং করতে পারে এবং আমার কিছু মান সেট করতে হবে। এটি কী বৈশ্বিক পরিবর্তনশীলতে সেট করে ঠিক আছে এবং এটি অন্যান্য সদস্যের কার্যক্রমে ব্যবহার করে? যদি তাই হয় কিভাবে? এখনও অবধি, আমি ক্লাসের বাইরে একটি ভেরিয়েবল ঘোষণা করেছিলাম। এবং এটির একটি ফাংশন সেট করা অন্য ফাংশনে প্রতিফলিত হয় না ??


8
আপনি যদি কোনও ত্রুটি কোডটি ফেরত দেওয়ার কথা ভাবছিলেন তবে পরিবর্তে একটি ব্যতিক্রম বাড়ান raise
জোজি

4
আপনার মন্তব্য মুছে ফেলুন এবং আপনার প্রশ্ন আপডেট করুন। আপনি প্রশ্ন মালিক। এটা আপনার প্রশ্ন আপনার আসল সমস্যাটি কী তা সঠিকভাবে দেখাতে দয়া করে প্রশ্নটি ঠিক করুন। আপনি অপব্যবহার করছেন __init__; আপনি যা বাস্তবায়নের জন্য চেষ্টা করছেন তা যদি বর্ণনা করেন তবে আমরা আপনাকে সহায়তা করতে পারি।
এসলট

উত্তর:


120

__init__কিছুই ফেরত দেওয়া প্রয়োজন। আপনি অন্য কিছু ফেরাতে পারবেন না (বা কমপক্ষে হওয়া উচিত নয়)।

আপনি যে উদাহরণটি পরিবর্তনশীল (বা ফাংশন) দিতে চান তা তৈরি করার চেষ্টা করুন।

>>> class Foo:
...     def __init__(self):
...         return 42
... 
>>> foo = Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() should return None

24
+1: আপনি অন্য কিছু ফেরত দিতে পারবেন না । এটা কোন মানে না।
এসলট

73
init সদ্য নির্মিত বস্তুটি ফিরিয়ে দেয় না - টাইপ-এরিয়ারে যেমন দেখা যায়, কোনও কিছুই ফেরত দেওয়া দরকার, তাই না? নতুন নির্মিত বস্তুটি নতুন দ্বারা ফিরিয়ে দেওয়া হয় , init কেবল তার কয়েকটি বৈশিষ্ট্য সেট করে। তবে হ্যাঁ, আপনি যেমন বলেছিলেন, আরম্ভ করে নতুন বা নতুন কিছু পরিবর্তন করা আসলেই কোনও বোধগম্য নয়।
ওয়ার্নিকা

newএখানে কোথায় ? কি newপাইথন মধ্যে অন্তর্নিহিত? আমি ধরে নিয়েছিলাম পাইথনের শব্দার্থকতা জাভা এবং এই শব্দটি ব্যবহার করে এমন অন্যান্য ভাষাগুলির চেয়ে আলাদা ছিল।
cs95

4
@ শিভা আফাইক, নতুন ওয়ারোনিকা দ্বারা বোঝানো হয়েছে __ নতুন __ (স্ব) সাধারণ জাভা শব্দার্থক নয়।
হর্ষ দাফ্টারি

4
এটি সম্পন্ন করা যায় না তার অর্থ এটি বোঝায় না। উদাহরণস্বরূপ, super().__init__উদাহরণস্বরূপ ভেরিয়েবলের মাধ্যমে এটি রিলে না রেখে ডাইরিক্ট ক্লাসে ডেটা পাঠানো ভাল হবে।
সিজেড

125

আপনি এটি কেন করতে চান?

শ্রেণি কল করার সময় আপনি যদি অন্য কোনও বস্তুটি ফিরিয়ে দিতে চান তবে __new__()পদ্ধতিটি ব্যবহার করুন :

class MyClass(object):
    def __init__(self):
        print "never called in this case"
    def __new__(cls):
        return 42

obj = MyClass()
print obj

9
হ্যাঁ, নতুন হয় সেখানে কোন কারণে আপনি আসলে যে কাজ করতে চান পারে - একটি বর্গ উদাহরণস্বরূপ ছাড়া অন্য কিছু ফিরে যখন একটি বর্গ ... আমি হতাশ করছি ব্যবহারের সঠিক উপায়?
ওয়ার্নিকা

34
@ অ্যারোনিকা একটি ধারণা: যে কোনও পরিস্থিতিতে আপনি সাধারণত কারখানা ব্যবহার করেন তবে আপনার কাছে এমন একটি ইন্টারফেস উপস্থাপন করতে চান যা স্বাভাবিক বর্গের ইনস্ট্যান্টেশনের মতো দেখাচ্ছে। উদাহরণ: আপনার শ্রেণীর মধ্যে কিছু নতুন alচ্ছিক পরামিতি যুক্ত করার সময় __init__, আপনি বুঝতে পেরেছেন যে সত্যিকার অর্থে আপনার নমনীয়তাটি সরবরাহ করতে আপনার একটি ক্লাস ফ্যাক্টরি দরকার যা বিশেষায়িত সাবক্লাসগুলির উদাহরণগুলি ফেরত দেয়। তবে আপনার গ্রন্থাগারের ব্যবহারকারীরা ইতিমধ্যে আপনার বিদ্যমান এপিআই ব্যবহার করছেন। এটি সংরক্ষণ করার জন্য, আপনি __new__আপনার বিশেষায়িত সাবক্লাসগুলির উদাহরণগুলি ফেরত দিতে ওভাররাইড করুন ।
মার্ক অ্যামেরি

10
আপনি যদি মার্ক আমেরি বলেছিলেন তার একটি উদাহরণ দেখতে চান datetime, স্ট্যান্ডার্ড লাইব্রেরি থেকে মডিউলটির উত্স কোডটি দেখুন । এটি __new__ঠিক এই ফ্যাশন ব্যবহার করে ।
জেরেইন

এছাড়াও যদি কেউ এটি করতে চায় তবে অবজেক্টের উত্তরাধিকারী হওয়ার বিষয়টি নিশ্চিত করুন অন্যথায় এটি কাজ করবে না।
মিনো_ই

আমি এই ধরণের বিবেচনা করি, কেবল একটি নিয়মিত ফাংশন ব্যবহার করা আরও বোধগম্য হয়। জাভা মাত্রা (ক্লাসে না ফাংশন? ধর্মবিরোধী!) তবে এর অজগর থেকে লোকেরা কিছুটা পরকীয় হতে পারে। (এছাড়াও আপনি ফান্টনাম.ওয়ালওয়াল = যেমন হিসাবে ফাংশনগুলিতে বৈশিষ্ট্যগুলি নির্ধারণ করতে পারেন .. যা বন্যপ্রাণীর মতো তবে এটি কাজ করে)
শায়নে

37

এর ডকুমেন্টেশন থেকে__init__ :

কনস্ট্রাক্টরগুলির একটি বিশেষ বাধা হিসাবে, কোনও মান ফেরত দেওয়া যাবে না; এটি করার ফলে রানটাইমগুলিতে টাইপরর উত্থাপিত হবে।

একটি প্রমাণ হিসাবে, এই কোড:

class Foo(object):
    def __init__(self):
        return 2

f = Foo()

এই ত্রুটি দেয়:

Traceback (most recent call last):
  File "test_init.py", line 5, in <module>
    f = Foo()
TypeError: __init__() should return None, not 'int'

17

প্রশ্নযুক্ত বিষয়টির নমুনা ব্যবহারের মতো হতে পারে:

class SampleObject(object):

    def __new__(cls, item):
        if cls.IsValid(item):
            return super(SampleObject, cls).__new__(cls)
        else:
            return None

    def __init__(self, item):
        self.InitData(item) #large amount of data and very complex calculations

...

ValidObjects = []
for i in data:
    item = SampleObject(i)
    if item:             # in case the i data is valid for the sample object
        ValidObjects.append(item)

আমার যথেষ্ট খ্যাতি নেই তাই মন্তব্য লিখতে পারি না, এটা তো পাগল! আমি আশা করি আমি এটি ওয়ার্নিকার মন্তব্য হিসাবে পোস্ট করতে পারতাম


4
এটি একটি নেমরর উত্থাপন করবে: selfসংজ্ঞায়িত হয়নি__new__(cls, Item)
হার্ট সিমহা

15

__init__পদ্ধতি, একটি ফিরতি বিবৃতি অনুপস্থিতিতে ডিফল্টরূপে অন্যান্য পদ্ধতি এবং ফাংশন আয় কোনটি মতো, আপনি এই উভয় পছন্দ লিখতে পারেন তাই হয়:

class Foo:
    def __init__(self):
        self.value=42

class Bar:
    def __init__(self):
        self.value=42
        return None

তবে, অবশ্যই, যুক্তটি return Noneআপনাকে কিছু কিনে না।

আপনি কী পরে তা নিশ্চিত নই তবে আপনি এর মধ্যে একটিতে আগ্রহী হতে পারেন:

class Foo:
    def __init__(self):
        self.value=42
    def __str__(self):
        return str(self.value)

f=Foo()
print f.value
print f

মুদ্রণ:

42
42

ওহ .. আমি কি ক্লাসে সদস্য ভেরিয়েবল অ্যাক্সেস করতে পারি? তারপরে এটি আমার সমস্যার সমাধান করা উচিত .... ধন্যবাদ
ওয়েবমোনাল.আর.২২

@ লক্ষ্মীপাঠি, হ্যাঁ, উদাহরণের মত ভেরিয়েবলগুলি সর্বজনীন।
কোমরানা

কোনও শ্রেণীর সূচনা করার পরে মূল্যবান কিছু ফেরত পেতে অনিয়ন্ত্রক হিসাবে:f = Foo().value
জেএলটি

@ জেএলটি হ্যাঁ, আপনি ক্যামেরা সর্বদা এটি করেন তবে এর অর্থ এই নয় যে কোনও কিছু থেকে ফিরে এসেছে __init__
কুমারানা


4

আপনি এটিকে কেবল একটি শ্রেণি পরিবর্তনে সেট করতে পারেন এবং এটি মূল প্রোগ্রাম থেকে পড়তে পারেন:

class Foo:
    def __init__(self):
        #Do your stuff here
        self.returncode = 42
bar = Foo()
baz = bar.returncode

3

init () কোনও মান পুরোপুরি সমাধান করা হবে না return

class Solve:
def __init__(self,w,d):
    self.value=w
    self.unit=d
def __str__(self):
    return str("my speed is "+str(self.value)+" "+str(self.unit))
ob=Solve(21,'kmh')
print (ob)

আউটপুট: আমার গতি 21 কিমি ঘন্টা


2

কেবল যোগ করতে চেয়েছিলেন, আপনি ক্লাসে ফিরে আসতে পারেন __init__

@property
def failureException(self):
    class MyCustomException(AssertionError):
        def __init__(self_, *args, **kwargs):
            *** Your code here ***
            return super().__init__(*args, **kwargs)

    MyCustomException.__name__ = AssertionError.__name__
    return MyCustomException

উপরের পদ্ধতিটি আপনাকে আপনার পরীক্ষার ব্যতিক্রম ব্যতীত একটি নির্দিষ্ট ক্রিয়া কার্যকর করতে সহায়তা করে


4
super().__init__ফিরছে None, তাই আপনি ফিরে যাচ্ছেন None, যা ভাল, তবে অতিরিক্ত।
সিজেড

-2

ঠিক আছে, আপনি যদি আর অবজেক্টের উদাহরণের বিষয়ে চিন্তা না করেন ... আপনি কেবল এটি প্রতিস্থাপন করতে পারেন!

class MuaHaHa():
def __init__(self, ret):
    self=ret

print MuaHaHa('foo')=='foo'

4
এটি কেবল selfসেই কনস্ট্রাক্টরের ভিতরে যে নাম নির্ধারিত হয়েছে তা পরিবর্তন করে ।
ওন্দ্রেজ কে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.