Saya sedang menulis beberapa kode yang mengambil nama file, membuka file, dan mem-parsing beberapa data. Saya ingin melakukan ini di kelas. Kode berikut berfungsi:
class MyClass():
def __init__(self, filename):
self.filename = filename
self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
def parse_file():
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5
parse_file()
Tapi itu melibatkan saya menempatkan semua mesin parsing dalam lingkup __init__
fungsi untuk kelas saya. Itu terlihat bagus sekarang untuk kode yang disederhanakan ini, tetapi fungsinya parse_file
memiliki beberapa level indention juga. Saya lebih suka mendefinisikan fungsi parse_file()
sebagai fungsi kelas seperti di bawah ini:
class MyClass():
def __init__(self, filename):
self.filename = filename
self.stat1 = None
self.stat2 = None
self.stat3 = None
self.stat4 = None
self.stat5 = None
parse_file()
def parse_file():
#do some parsing
self.stat1 = result_from_parse1
self.stat2 = result_from_parse2
self.stat3 = result_from_parse3
self.stat4 = result_from_parse4
self.stat5 = result_from_parse5
Tentu saja kode ini tidak berfungsi karena fungsinya parse_file()
tidak dalam cakupan __init__
fungsi. Apakah ada cara untuk memanggil fungsi kelas dari dalam __init__
kelas itu? Atau apakah saya memikirkan hal ini dengan cara yang salah?
Jawaban:
Panggil fungsi dengan cara ini:
Anda juga perlu mendefinisikan fungsi parse_file () Anda seperti ini:
The
parse_file
Metode harus terikat ke objek pada menyebutnya (karena itu bukan metode statis). Ini dilakukan dengan memanggil fungsi pada instance objek, dalam kasus Anda instance adalahself
.sumber
Jika saya tidak salah, kedua fungsi adalah bagian dari kelas Anda, Anda harus menggunakannya seperti ini:
ganti baris Anda:
dengan:
sumber
self.parse_file()
dan tidakparse_file()
?def parse_file(self):
tidak bersarang di bawah__init__
fungsi sehingga Anda tidak memiliki objek yang diinisialisasi sebagian?Bagaimana tentang:
By the way, jika Anda memiliki variabel bernama
stat1
,stat2
, dll, situasi ini mengemis untuk tupel:stats = (...)
.Jadi,
parse_file
kembalikan tupel, dan simpan tupelnyaself.stats
.Kemudian, misalnya, Anda dapat mengakses apa yang dulu disebut
stat3
denganself.stats[2]
.sumber
parse_file
fungsi menjadi metodeMyClass
objek. Di mana akanself
diperlukan?Di
parse_file
, ambilself
argumen (seperti di__init__
). Jika ada konteks lain yang Anda butuhkan maka berikan saja argumen tambahan seperti biasa.sumber
Anda harus mendeklarasikan parse_file seperti ini;
def parse_file(self)
. Parameter "mandiri" adalah parameter tersembunyi di sebagian besar bahasa, tetapi tidak dalam python. Anda harus menambahkannya ke definisi semua metode yang dimiliki kelas. Kemudian Anda dapat memanggil fungsi dari metode apa pun di dalam kelas menggunakanself.parse_file
program akhir Anda akan terlihat seperti ini:
sumber
Saya berpikir bahwa masalah Anda sebenarnya dengan indentasi fungsi init yang tidak benar. Seharusnya seperti ini
sumber
@staticmethod
dekorator di atasparse_file
self
dalamparse_file
metode Anda .