سؤال

لدي فصل مع __init__ وظيفة.

كيف يمكنني إرجاع قيمة عدد صحيح من هذه الوظيفة عند إنشاء كائن؟

كتبت برنامجًا ، حيث __init__ هل تحليل سطر الأوامر وأحتاج إلى الحصول على بعض القيمة. هل هو موافق تعيينه في متغير عالمي واستخدامه في وظائف الأعضاء الأخرى؟ إذا كان الأمر كذلك كيف تفعل ذلك؟ حتى الآن ، أعلنت متغيرًا خارجيًا. وتعيين وظيفة واحدة لا تنعكس في وظيفة أخرى ؟؟

هل كانت مفيدة؟

المحلول

__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

نصائح أخرى

لماذا تريد أن تفعل ذلك؟

إذا كنت ترغب في إرجاع بعض الكائنات الأخرى عند استدعاء الفصل ، فاستخدم __new__() طريقة:

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

obj = MyClass()
print obj

من توثيق __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'

يمكن أن يكون استخدام عينة المسألة المعنية مثل:

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)

ليس لدي سمعة كافية حتى لا أستطيع كتابة تعليق ، إنه مجنون! أتمنى أن أتمكن من نشرها كتعليق على فيرونيكا

ال __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

__init__ لا يعيد أي شيء ويجب أن يعود دائمًا None.

أردت فقط إضافة ، يمكنك إرجاع الفصول الدراسية __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

تساعدك الطريقة أعلاه على تنفيذ إجراء محدد بناءً على استثناء في الاختبار

يمكنك فقط تعيينه على متغير الفصل وقراءته من البرنامج الرئيسي:

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

حسنًا ، إذا لم تعد تهتم بمثيل الكائن بعد الآن ... يمكنك استبداله فقط!

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

print MuaHaHa('foo')=='foo'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top