Pada
artikel sebelumnya, kami memeriksa beberapa poin menarik dari bahasa python, tentu saja, mereka tidak terbatas pada satu artikel, jadi kami akan melanjutkan.
Satu komentar memeriksa kode berikut:
SEX = 'Female', 'Male' sex = SEX[True]
Ini berfungsi karena tipe data logis setara dengan 0 dan 1, terlebih lagi,
pada awalnya tidak ada tipe khusus dan nilai 0 dan 1 digunakan. Dan ketika dimasukkan, kami memutuskan untuk mewarisi dari keseluruhan.
print(int.__subclasses__())
Tetapi kembali untuk mendapatkan nilai daftar, katakanlah kita memiliki data berikut:
books = [["Sherlock Holmes", "Arthur Conan Doyle", 1986, True, 12.51], ["The Lost World", "Arthur Conan Doyle", 2015, False, 5.95], ["The Art of Computer Programming", "Donald E. Knuth ", 2017, True, 190.54] ]
Tentu saja, merujuk pada nilai-nilai dengan indeks hardcode bukanlah cara kami. Anda dapat membuat konstanta, misalnya PENULIS dan menentukannya, tetapi Anda bisa melangkah lebih jauh:
TITLE_AUTHOR = slice(0, 2) PRICE_IN_STOCK = slice(3, 5) print(books[0][TITLE_AUTHOR]) print([book for book in books if book[PRICE_IN_STOCK] > [True, 10.0]])
Kita dapat membuat objek
slice dan menunjukkan padanya pada indeks apa bidang minat berada. Kami bahkan bisa cukup berani untuk menulis sesuatu yang mirip dengan baris terakhir di blok ini, yang menampilkan buku-buku yang tersedia di gudang dan lebih mahal dari 10 apa pun. Kode ini akan berfungsi, karena perbandingan daftar dan tupel berlangsung secara leksikografis: pertama elemen pertama dibandingkan, lalu yang kedua dan seterusnya, yaitu, objek apa pun yang in_stock "bidang" -nya salah akan lebih kecil daripada daftar [Benar, 10.0], karena Benar> Salah.
Catatan: tentu saja, kode ini tidak boleh digunakan dalam proyek, tetapi lebih baik membatasi diri Anda hanya untuk mendapatkan beberapa nilai untuk slice, lebih baik untuk membuat pilihan dalam database, baik di Panda atau sebagai metode kelas Buku. Anda dapat menggunakan namedtuple dan menulis modul kecil tempat meletakkan metode dengan pilihan serupa.
Kami telah mempertimbangkan argumen yang dapat diteruskan ke fungsi hanya dengan kunci. Baru-baru ini, ketika mempelajari
dokumentasi untuk fungsi bool , saya menemukan subskrip:
Berubah dalam versi 3.7: x sekarang menjadi parameter hanya posisi.
Sekarang
PEP 570 sedang dalam pengembangan, yang akan membuka kemungkinan untuk mengatur parameter tersebut, ini dapat berguna ketika nama parameter tidak masalah, seperti, bool (), pow (), dll.
Sintaks konsep terlihat seperti ini:
def name(positional_only_parameters, /, positional_or_keyword_parameters, *, keyword_only_parameters):
Kembali ke fungsi bool, yang berfungsi seperti memeriksa kondisi dan loop ketika Anda menjalankan kode
if obj:
python melakukan
prosedur yang agak
menarik untuk menghasilkan nilai boolean:
- Jika objek mengimplementasikan metode __bool __ (), maka hasil dari pemanggilan metode ini dikembalikan
- Jika tidak, akan diperiksa apakah metode __len __ () diimplementasikan, jika demikian, maka akan diperiksa kembali, jika 0, maka hasilnya akan Salah.
- Jika tidak ada metode yang diterapkan, maka True dikembalikan.
class A: pass a = A() print(bool(a))
Integer mengimplementasikan metode __bool__, koleksi standar tidak mengimplementasikannya, tetapi mengimplementasikan metode __len__:
print(dir(int))
Dalam
komentar lain , perilaku "non-standar" atribut kelas diberikan:
class Example: arr=[] def __init__(self): pass a = Example() b = Example() a.arr.append(1) print(a.arr)
Sangat penting untuk membedakan antara
atribut kelas dan objek , atribut objek dibuat, TERTENTU, dari objek.
Penting untuk dipahami bahwa bidang dan metode apa pun yang dideklarasikan di badan kelas adalah milik kelas. Untuk membuat atribut untuk objek, Anda perlu menetapkannya ke objek, dalam metode kelas melalui diri atau dalam teks program, melalui variabel objek.
Jika Anda bingung, mari kita uraikan kode sebelumnya, dua instance kelas dibuat di dalamnya, setelah itu 1 ditambahkan ke bidang arr melalui salah satu objek. Tetapi tidak ada atribut seperti itu di objek, konstruktor kosong, jadi python mencari atribut ini di kelas dan menemukannya, namun itu dibagikan oleh semua instance kelas. Anda dapat memverifikasi bahwa ini adalah atribut kelas pada baris terakhir, karena mengakses kelas dengan nama atribut ini tidak menghasilkan kesalahan apa pun.
Saat mempelajari bahasa baru, penting untuk dipahami bahwa setiap bahasa memiliki filosofi sendiri, dan tidak semua bahasa memiliki kata kunci statis. Terkadang mekanisme serupa disediakan oleh mekanisme lain.
Paling jelas, gagasan bahwa python bukan java menggambarkan bahwa penambahan bidang dalam objek dan kelas dilakukan melalui tugas yang biasa:
def make_title(self): if self.title == 'Mister': return 'Mr. ' + self.surname class Person: pass john = Person() john.title = 'Mister' john.name = 'John' john.surname = 'Peterson' john.age = 33 Person.make_title = make_title print(john.make_title())
Rekomendasi umum: jangan menyimpan tipe yang bisa berubah sebagai instance dari kelas, ini penuh, namun, jika Anda tahu apa yang Anda lakukan, maka gunakan fungsionalitas ini sepenuhnya, hal utama adalah memikirkan semuanya dengan seksama di awal dan mendokumentasikan setelahnya.
Sebagai contoh, sangat mudah untuk membuat kelas yang menyimpan tautan ke semua instansnya:
class RememberAll(): instances = [] def __init__(self): self.instances.append(self) a = RememberAll() b = RememberAll() print(RememberAll.instances)
Anda dapat mengimplementasikan kelas dari beberapa objek fisik dan, ketika mengubah karakteristiknya, memanggil metode untuk menghitung ulang karakteristik elemen lain dari sistem. Atau ingat semua bilah geser pada formulir dan ketika Anda menggesernya, pindahkan sisanya secara otomatis. Saya tidak berani mengatakan bahwa implementasi seperti itu selalu baik, tetapi kadang-kadang bisa bermanfaat.
Yah, karena kita telah membahas fisika, saya ingin menyebutkan operator @. Ya ada
satu . Itu diperkenalkan untuk perkalian matriks, yang paling lucu, tetapi tampaknya itu belum diimplementasikan untuk semua tipe data standar, yaitu, awalnya hanya diperkenalkan untuk perpustakaan pihak ketiga. Tetapi tidak ada yang mencegah Anda menambahkan dukungannya untuk tipe data Anda dengan menerapkan metode __matmul__, __rmatmul__, __imatmul__
class Person: def __init__(self, name): self.name = name def __matmul__(self, msg): return "@" + self.name + " " + msg john = Person("John") print(john @ "hello")