Bagaimana cara mendapatkan nama kelas yang saya ikuti saat ini?
Contoh:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
Karena sifat program yang saya antarmuka (vistrails), saya tidak dapat menggunakan __init__()
untuk menginisialisasi input
.
getName
dari kelas anak, itu akan mengeluarkan nama kelas anak. Ini kemudian menjadi rumit jika Anda BENAR-BENAR menginginkan kelas yang Anda tangani.getName
dari kelas induk, itu akan menampilkan nama kelas anak? Ok ty untuk menunjukkan itu.getName()
metode tersebut kebetulan didefinisikan dalam superclass) sudah benar.Di dalam tubuh kelas, nama kelas belum ditentukan, sehingga tidak tersedia. Bisakah Anda tidak langsung mengetik nama kelasnya? Mungkin Anda perlu menjelaskan lebih lanjut tentang masalah tersebut agar kami dapat menemukan solusi untuk Anda.
Saya akan membuat metaclass untuk melakukan pekerjaan ini untuk Anda. Ini dipanggil pada waktu pembuatan kelas (secara konseptual di akhir kelas: blok), dan dapat memanipulasi kelas yang sedang dibuat. Saya belum menguji ini:
sumber
MyType
dalamsuper
baris tersebutInputAssigningMetaclass
?Anda dapat mengaksesnya dengan atribut pribadi kelas:
EDIT:
Seperti yang dikatakan
Ned Batcheler
, ini tidak akan berfungsi di badan kelas, tetapi akan berfungsi dalam metode.sumber
PEP 3155 diperkenalkan
__qualname__
, yang diimplementasikan dengan Python 3.3.Ini dapat diakses dari dalam definisi kelas atau fungsi, jadi misalnya:
akan mencetak secara efektif
Foo
. Anda akan mendapatkan nama yang sepenuhnya memenuhi syarat (tidak termasuk nama modul), jadi Anda mungkin ingin membaginya pada.
karakter.Namun, tidak ada cara untuk mendapatkan pegangan sebenarnya pada kelas yang sedang didefinisikan.
sumber
EDIT: Ya, Anda bisa; tetapi Anda harus menipu: Nama kelas yang sedang berjalan ada di tumpukan panggilan, dan
traceback
modul memungkinkan Anda untuk mengakses tumpukan.Namun, saya tidak akan melakukan ini; Jawaban asli saya masih menjadi pilihan saya sendiri sebagai solusi. Jawaban asli:
Mungkin solusi paling sederhana adalah dengan menggunakan dekorator, yang mirip dengan jawaban Ned yang melibatkan metaclasses, tetapi kurang kuat (dekorator mampu melakukan sihir hitam, tetapi metaclasses mampu melakukan sihir hitam kuno dan okultisme )
sumber
sumber
Saya pikir, seharusnya seperti ini:
sumber