Apa variabel 'cls' yang digunakan untuk di kelas Python?

270

Mengapa clsterkadang digunakan sebagai ganti selfargumen di kelas Python?

Sebagai contoh:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    @classmethod
    def from_fullname(cls, fullname):
        cls.firstname, cls.lastname = fullname.split(' ', 1)
Scaraffe
sumber

Jawaban:

293

Perbedaan antara "self"dan "cls"didefinisikan dalam PEP 8. Seperti yang dikatakan Adrien, ini bukan wajib. Ini gaya pengkodean. PEP 8mengatakan:

Argumen fungsi dan metode :

Selalu gunakan selfargumen pertama ke metode instance.

Selalu gunakan clsuntuk argumen pertama ke metode kelas.

Baskaya
sumber
56

Ini digunakan dalam kasus metode kelas. Periksa referensi ini untuk perincian lebih lanjut.

EDIT: Seperti diklarifikasi oleh Adrien, itu adalah konvensi. Anda benar-benar dapat menggunakan apa pun kecuali clsdan selfdigunakan ( PEP8 ).

Juho Vepsäläinen
sumber
52

clsmenyiratkan bahwa metode milik kelas sementara diri menyiratkan bahwa metode ini terkait dengan instance dari kelas, oleh karena itu anggota dengan clsdiakses oleh nama kelas di mana sebagai satu dengan diri diakses oleh instance dari kelas ... itu adalah konsep yang sama sebagai static memberdan non-static membersdi java jika Anda berasal dari latar belakang java.

bashir abdilatif
sumber
1
Terima kasih atas referensi Java, sekarang mengerti.
Edenshaw
Daripada Anda untuk menyebutkan static memberdan non-static members, mengerti dalam konteks c ++
Amit JS
18

Ini adalah pertanyaan yang sangat bagus tetapi tidak ingin seperti pertanyaan. Ada perbedaan antara metode yang digunakan 'sendiri' dan 'cls' meskipun secara analog mereka berada di tempat yang sama

def moon(self, moon_name):
    self.MName = moon_name

#but here cls method its use is different 

@classmethod
def moon(cls, moon_name):
    instance = cls()
    instance.MName = moon_name

Sekarang Anda dapat melihat keduanya adalah fungsi bulan tetapi satu dapat digunakan di dalam kelas sementara fungsi lain bulan dapat digunakan untuk kelas apa pun.

Untuk pendekatan pemrograman praktis:

Saat mendesain kelas lingkaran, kami menggunakan metode area sebagai cls daripada self karena kami tidak ingin area dibatasi hanya untuk kelas lingkaran tertentu.

Pengusir setan
sumber
jika Anda ingin menambahkan sesuatu yang coders cari, jika benar, akan menyetujuinya.
TheExorcist
2

Alih-alih menerima parameter diri, metode kelas mengambil parameter cls yang menunjuk ke kelas — dan bukan objek contoh — ketika metode ini dipanggil. Karena metode kelas hanya memiliki akses ke argumen cls ini, itu tidak dapat mengubah keadaan instance objek . Itu akan membutuhkan akses ke diri sendiri. Namun, metode kelas masih dapat memodifikasi status kelas yang berlaku di semua instance kelas.

- Trik Python

otentikasi tinggi
sumber