كيف تعيد قيمة من __init__ في بيثون؟
سؤال
لدي فصل مع __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'