Pertanyaan Bagaimana cara mengembalikan nilai dari __init__ dengan Python?


Saya memiliki kelas dengan __init__ fungsi.

Bagaimana saya bisa mengembalikan nilai integer dari fungsi ini ketika sebuah objek dibuat?

Saya menulis sebuah program, di mana __init__ apakah parsing baris perintah dan saya harus memiliki beberapa nilai ditetapkan. Apakah OK mengaturnya dalam variabel global dan menggunakannya dalam fungsi anggota lain? Jika demikian bagaimana melakukannya? Sejauh ini, saya menyatakan variabel di luar kelas. dan pengaturannya satu fungsi tidak mencerminkan fungsi lain ??


75
2018-03-22 11:35


asal


Jawaban:


__init__ diperlukan untuk mengembalikan Tidak ada. Anda tidak dapat (atau setidaknya tidak boleh) mengembalikan yang lain.

Cobalah membuat apa pun yang Anda inginkan untuk mengembalikan variabel instance (atau fungsi).

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

75
2018-03-22 11:37



Kenapa kamu mau melakukan itu?

Jika Anda ingin mengembalikan objek lain ketika kelas dipanggil, gunakan itu __new__() metode:

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

obj = MyClass()
print obj

89
2018-03-22 11:46



Dari dokumentasi __init__:

Sebagai kendala khusus pada konstruktor, tidak ada nilai yang dapat dikembalikan; hal tersebut akan menyebabkan TypError dibangkitkan saat runtime.

Sebagai bukti, kode ini:

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

f = Foo()

Memberikan kesalahan ini:

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

37
2018-03-22 11:41



Contoh Penggunaan materi yang dipermasalahkan dapat berupa:

class SampleObject(object)

    def __new__(cls,Item)
        if self.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)

Saya tidak memiliki reputasi yang cukup sehingga saya tidak bisa menulis komentar, itu gila! Saya berharap dapat mempostingnya sebagai komentar weronika


13
2017-07-07 12:37



Itu __init__ metode, seperti metode dan fungsi lainnya mengembalikan None secara default dengan tidak adanya pernyataan kembali, sehingga Anda dapat menulisnya seperti ini:

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

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

Tapi, tentu saja, menambahkan return None tidak membelimu apa-apa.

Saya tidak yakin apa yang Anda cari, tetapi Anda mungkin tertarik dengan salah satu di antaranya:

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

f=Foo()
print f.value
print f

cetakan:

42
42

12
2018-03-22 11:52



__init__ tidak mengembalikan apa-apa dan harus selalu kembali None.


8
2018-03-22 11:39



Hanya ingin menambahkan, Anda dapat mengembalikan kelas __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

Metode di atas membantu Anda menerapkan tindakan tertentu pada Pengecualian dalam pengujian Anda


2
2018-06-02 08:52