Katakanlah kami ingin memberikan abstraksi "akun" di bank. Inilah satu pendekatan, menggunakan function
objek dalam Python:
def account():
"""Return a dispatch dictionary representing a bank account.
>>> a = account()
>>> a['deposit'](100)
100
>>> a['withdraw'](90)
10
>>> a['withdraw'](90)
'Insufficient funds'
>>> a['balance']
10
"""
def withdraw(amount):
if amount > dispatch['balance']:
return 'Insufficient funds'
dispatch['balance'] -= amount
return dispatch['balance']
def deposit(amount):
dispatch['balance'] += amount
return dispatch['balance']
dispatch = {'balance': 0,
'withdraw': withdraw,
'deposit': deposit}
return dispatch
Berikut pendekatan lain menggunakan abstraksi tipe (yaitu, class
kata kunci dengan Python):
class Account(object):
"""A bank account has a balance and an account holder.
>>> a = Account('John')
>>> a.deposit(100)
100
>>> a.withdraw(90)
10
>>> a.withdraw(90)
'Insufficient funds'
>>> a.balance
10
"""
def __init__(self, account_holder):
self.balance = 0
self.holder = account_holder
def deposit(self, amount):
"""Add amount to balance."""
self.balance = self.balance + amount
return self.balance
def withdraw(self, amount):
"""Subtract amount from balance if funds are available."""
if amount > self.balance:
return 'Insufficient funds'
self.balance = self.balance - amount
return self.balance
Guru saya memulai topik "Pemrograman berorientasi objek" dengan memperkenalkan class
kata kunci, dan menunjukkan kepada kami poin-poin berikut:
Pemrograman berorientasi objek
Metode untuk mengatur program modular:
- Hambatan abstraksi
- Pesan lewat
- Menyatukan informasi dan perilaku terkait
Apakah Anda pikir pendekatan pertama akan cukup untuk memenuhi definisi di atas? Jika ya, mengapa kita perlu class
kata kunci untuk melakukan pemrograman berorientasi objek?
design
object-oriented
python
object-oriented-design
object
pertukaran berlebihan
sumber
sumber
class
melakukan optimasi yang sama).foo.bar()
biasanya identik denganfoo['bar']()
, dan pada kesempatan langka sintaks yang terakhir sebenarnya berguna.object['method'](args)
, objek Python benar-benar melakukan hal yang setaraobject['method'](object, args)
. Ini menjadi relevan ketika kelas dasar memanggil metode dalam kelas anak, misalnya dalam Pola Strategi.Jawaban:
Selamat! Anda menemukan kembali fakta terkenal bahwa orientasi objek dapat dilakukan tanpa dukungan bahasa pemrograman tertentu. Pada dasarnya ini adalah cara yang sama dengan objek yang diperkenalkan dalam Skema dalam buku teks klasik ini . Perhatikan bahwa Skema tidak memiliki
class
kata kunci atau sejenisnya, dan objek dapat dibuat tanpa kelas genap.Namun, paradigma berorientasi objek sangat sukses sehingga banyak bahasa - dan Python tidak terkecuali - menyediakan dukungan bawaan untuknya. Ini hanya untuk memudahkan pengembang untuk menggunakan paradigma dan menyediakan bentuk standar orientasi objek untuk bahasa itu. Ini pada dasarnya adalah alasan yang sama mengapa banyak bahasa menyediakan
for
loop, meskipun itu bisa ditiru menggunakanwhile
loop hanya dengan satu atau dua baris kode tambahan - cukup mudah digunakan .sumber
Saya setuju bahwa definisi pertama memenuhi tiga poin yang dibuat oleh guru Anda. Saya tidak berpikir kita perlu kata kunci kelas untuk apa pun. Di bawah selimut, apa lagi yang merupakan objek tetapi struktur data dengan berbagai jenis data dan fungsi untuk bekerja dengan data? Tentu saja, fungsinya adalah data juga ..
Saya akan melangkah lebih jauh dan mengatakan bahwa melakukan pemrograman berorientasi objek tidak terlalu tergantung pada kata kunci yang disediakan bahasa Anda, Anda dapat melakukan pemrograman berorientasi objek dalam C jika Anda menginginkannya! Bahkan, kernel linux menggunakan teknik seperti itu.
Apa yang dapat Anda simpulkan dari kata kunci kelas di sini adalah, bahwa bahasa tersebut memberikan dukungan untuk konstruksi semacam ini di luar kotak, dan Anda tidak perlu melalui semua rintangan untuk menerapkan kembali fungsi itu sendiri (yang merupakan tugas yang cukup menyenangkan di diri!). Belum lagi semua gula sintaksis yang mungkin Anda dapatkan juga.
sumber
Tentu saja Anda bisa!
Bahasa pemrograman mandiri adalah bahasa berorientasi objek berbasis prototipe dinamis di mana semuanya adalah objek dan tidak ada rasa kelas atau apa pun. Ini terfokus pada gagasan objek prototipe dan gagasan kloning mereka alih-alih memiliki kelas sebagai template tentang cara membuat objek.
Anda harus memeriksa http://www.selflanguage.org/ untuk informasi lebih lanjut. Saya pikir ini sangat menarik dan jika Anda suka OOP itu ide yang baik untuk memeriksa sesuatu yang tidak umum.
sumber
Tidak selalu: itu tergantung pada bahasa. Anda telah menunjukkan kemampuan untuk melakukan ini dengan Python tetapi (jika pertanyaan Anda dimaksudkan sebagai agnostik bahasa meskipun menggunakan tag Python) tidak semua bahasa dapat melakukan ini. Java, misalnya, kebanyakan tidak bisa. Mengabaikan kelas yang berisi main, tidak ada cara untuk mendefinisikan metode / bidang sembarang pada objek yang didefinisikan dalam utama tanpa kata kunci kelas. Meskipun kelas anonim memang ada, mereka memerlukan antarmuka dan mereka tidak dapat memiliki anggota publik kecuali yang ditentukan dalam antarmuka. Meskipun dimungkinkan untuk mendefinisikan antarmuka khusus lalu membuat kelas anonim untuk mereka, ini secara efektif sama (tapi kurang nyaman) daripada hanya menggunakan kelas.
Doc Brown memiliki jawaban yang bagus tetapi yang ingin saya sampaikan adalah bahwa saya yakin setidaknya ada satu bahasa yang tidak memungkinkan solusi Anda sama sekali.
sumber
class
kata kunci sehingga tidak terlalu mengejutkan. Tetapi Anda benar-benar dapat menerapkan sistem objek Anda sendiri di atas sistem objek Java, meskipun saya tidak tahu mengapa Anda ingin melakukan hal seperti itu.class
kata kunci hanya karena bahasa mengharuskan Anda untuk menempatkan fungsi Anda di kelas. Tentu saja, ini sangat teoretis, tetapi bahkan di Jawa Anda dapat melakukan Orientasi Objek tanpa kelas bawaan!Definisi guru Anda benar-benar kehilangan poin terpenting dari pemrograman berorientasi objek, satu hal yang membuatnya berguna dan unik. "Pesan yang lewat" adalah omong kosong yang diimpikan oleh orang-orang Smalltalk, dan ini merupakan kegagalan di mana-mana hal itu telah dicoba. Kekuatan sebenarnya dari OOP adalah sesuatu yang dikenal sebagai substitusi Liskov , dan walaupun konsepnya cukup sederhana untuk dijelaskan dan dipahami, implementasi yang mendasarinya cukup kompleks sehingga pada dasarnya tidak mungkin dilakukan dengan benar tanpa dukungan tingkat bahasa.
Gagasan substitusi Liskov adalah bahwa di mana pun kode Anda mengharapkan variabel dari jenis tertentu, ia harus dapat menerima jenis apa pun yang berasal dari jenis itu dan tetap berfungsi dengan benar tanpa harus memiliki pengetahuan tentang detail dari jenis yang diturunkan.
Misalnya, kerangka kerja GUI menggunakan substitusi Liskov di semua tempat. Mereka cenderung memiliki
Control
kelas dasar yang dapat mewakili "kontrol apa saja", yang mendefinisikan antarmuka yang tahu tentang tindakan dasar seperti menggambar, mengubah ukuran, dan menanggapi input pengguna. Jika Anda mengklik kontrol, kerangka kerja UI akan memanggilClick
metode pada kontrol tanpa harus peduli tentang kontrol apa itu, dan kemudian biarkan kontrol menangani klik dengan cara yang sesuai untuk kelasnya sendiri. SebuahButton
kontrol harus melakukan sesuatu yang sama sekali berbeda ketika diklik dariTextBox
kontrol, untuk memberikan hanya satu contoh.Jadi ya, Anda bisa membuat sesuatu yang mirip dengan objek menggunakan trik fungsi bersarang yang dijelaskan di atas, tetapi karena Anda tidak bisa mendapatkan pewarisan dan substitusi Liskov dengan cara itu, itu adalah pengganti yang sangat terbatas untuk OOP sejati.
sumber
child*
ke fungsi yang mengambilparent*
sebagai argumen, setidaknya bukan tanpa typecast.) Dan lebih buruk lagi, struct C tidak dapat memiliki metode terikat padanya, dan tidak ada dukungan untuk metode virtual , yang apa yang membuat keajaiban substitusi Liskov bekerja, jadi Anda harus membuat VMT dengan tangan, yang merupakan proses rumit yang mudah dikacaukan.Jawaban Singkat Cepat
Ya, Pemrogram dapat menerapkan Pemrograman Berorientasi Objek tanpa "Kelas".
Jawaban Deskriptif Ekstensif Panjang Membosankan
Ada beberapa variasi "Orientasi Objek", kata Altought, konsep pertama yang muncul di benak banyak programmer adalah "Kelas".
Ya, Pemrogram dapat menerapkan Pemrograman Berorientasi Objek tanpa "Kelas", tetapi, terbatas pada fitur dan batasan dari setiap bahasa pemrograman.
Posting Anda ditandai sebagai Python , oleh karena itu, judul pertanyaan Anda mungkin lebih seperti "Bagaimana menerapkan Pemrograman Berorientasi Objek tanpa Kelas di Python".
Saat ini saya menggunakan frase "Object and Class Oriented Programming", untuk mengidentifikasi dari variasi lain seperti Javascript "Prototyping", atau Visual Basic "Based", atau emulasi dalam "Pure C" menggunakan "functors".
sumber