Tutorial berorientasi objek Python Terbaik Pada tahun 2024, Dalam tutorial ini Anda dapat mempelajari Berorientasi Objek Ikhtisar Teknologi,membuat kelas,Buat instance dari objek,Properti akses,Python atribut class built-in,objek python hancur (pengumpulan sampah),warisan kelas,metode menimpa,metode Yayasan kelebihan beban,Overloading Operator,atribut kelas dan metode,
Python telah dirancang dari awal adalah bahasa berorientasi objek, dan dengan demikian, membuat kelas dan objek di python sangat mudah. bagian ini kita akan detail pemrograman berorientasi objek dengan Python.
Jika Anda belum terkena berorientasi objek bahasa pemrograman, maka Anda mungkin harus terlebih dahulu memahami beberapa fitur dasar bahasa berorientasi objek, terbentuk dalam pikiran dalam konsep dasar object-oriented, yang membantu Anda lebih mudah belajar Python pemrograman berorientasi obyek.
Selanjutnya, mari kita pemahaman sederhana berorientasi objek di bawah beberapa fitur dasar.
Gunakan pernyataan kelas untuk membuat kelas baru, setelah kelas, dan nama kelas berakhir dengan usus, contoh-contoh berikut:
class ClassName: '类的帮助信息' #类文档字符串 class_suite #类体
kelas bantuan dapat dilihat oleh ClassName .__ doc__.
class_suite terdiri dari anggota kelas, metode, atribut data.
Berikut ini adalah contoh kelas Python sederhana:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary
Untuk membuat sebuah instance dari kelas, Anda dapat menggunakan nama kelas, dan menerima metode parameter __init__.
"创建 Employee 类的第一个对象" emp1 = Employee("Zara", 2000) "创建 Employee 类的第二个对象" emp2 = Employee("Manni", 5000)
Anda dapat menggunakan dot (.) Properti untuk mengakses objek. Mengakses variabel kelas dengan nama kelas sebagai berikut:
emp1.displayEmployee() emp2.displayEmployee() print "Total Employee %d" % Employee.empCount
contoh lengkap:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary "创建 Employee 类的第一个对象" emp1 = Employee("Zara", 2000) "创建 Employee 类的第二个对象" emp2 = Employee("Manni", 5000) emp1.displayEmployee() emp2.displayEmployee() print "Total Employee %d" % Employee.empCount
Mengeksekusi kode di atas hasil output adalah sebagai berikut:
Name : Zara ,Salary: 2000 Name : Manni ,Salary: 5000 Total Employee 2
Anda dapat menambahkan, menghapus, mengubah properti kelas sebagai berikut:
emp1.age = 7 # 添加一个 'age' 属性 emp1.age = 8 # 修改 'age' 属性 del emp1.age # 删除 'age' 属性
Anda juga dapat mengakses properti menggunakan fungsi berikut:
hasattr(emp1, 'age') # 如果存在 'age' 属性返回 True。 getattr(emp1, 'age') # 返回 'age' 属性的值 setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8 delattr(empl, 'age') # 删除属性 'age'
Python panggilan built-in contoh atribut kelas adalah sebagai berikut:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary print "Employee.__doc__:", Employee.__doc__ print "Employee.__name__:", Employee.__name__ print "Employee.__module__:", Employee.__module__ print "Employee.__bases__:", Employee.__bases__ print "Employee.__dict__:", Employee.__dict__
Mengeksekusi kode di atas hasil output adalah sebagai berikut:
Employee.__doc__: 所有员工的基类 Employee.__name__: Employee Employee.__module__: __main__ Employee.__bases__: () Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x10a939578>}
Seperti bahasa Java, Python menggunakan referensi menghitung teknik sederhana ini untuk melacak obyek dalam memori.
Dalam catatan internal yang Python dari semua benda menggunakan nomor masing-masing referensi.Sebuah variabel pelacakan internal, disebut counter referensi.
Ketika sebuah objek dibuat, itu menciptakan jumlah referensi, ketika objek tidak lagi diperlukan, yang mengatakan, referensi ke jumlah objek menjadi 0, itu adalah sampah yang dikumpulkan. Tapi pemulihan tidak "segera" oleh interpreter pada waktu yang tepat, benda-benda sampah menempati ruang memori reklamasi.
a = 40 # 创建对象 <40> b = a # 增加引用, <40> 的计数 c = [b] # 增加引用. <40> 的计数 del a # 减少引用 <40> 的计数 b = 100 # 减少引用 <40> 的计数 c[0] = -1 # 减少引用 <40> 的计数
mekanisme pengumpulan sampah tidak hanya untuk jumlah referensi obyek adalah 0, sama juga dapat menangani kasus referensi melingkar. Hal ini mengacu pada referensi melingkar, dua benda merujuk kepada satu sama lain, tetapi tidak ada referensi variabel lain mereka. Dalam hal ini, hanya jumlah referensi tidak cukup. Python kolektor sampah sebenarnya referensi ke counter siklus dan pengumpul sampah. Sebagai tambahan referensi menghitung sampah kolektor akan memperhatikan jumlah total yang dialokasikan benda besar (dan tidak menghitung mereka dihancurkan oleh referensi). Dalam hal ini, penafsir akan berhenti, berusaha untuk membersihkan semua siklus unreferenced.
Destructor __del__, __ del__ disebut ketika objek dihancurkan, ketika objek tidak lagi digunakan, __ metode del__ untuk menjalankan:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Point: def __init__( self, x=0, y=0): self.x = x self.y = y def __del__(self): class_name = self.__class__.__name__ print class_name, "销毁" pt1 = Point() pt2 = pt1 pt3 = pt1 print id(pt1), id(pt2), id(pt3) # 打印对象的id del pt1 del pt2 del pt3
Contoh hasil di atas adalah sebagai berikut:
3083401324 3083401324 3083401324 Point 销毁
Catatan: Biasanya Anda perlu mendefinisikan kelas dalam file terpisah,
Salah satu manfaat utama dari pemrograman berorientasi objek dibawa untuk menggunakan kembali kode reuse untuk mencapai salah satu dari ini adalah melalui mekanisme warisan. Mewarisi jenis dan subtipe benar-benar dimengerti hubungan antara kelas ke dalam.
Peringatan: Warisan Sintaks kelas turunan nama kelas (basis nama kelas): // id. menulis dasar nama kelas dalam kurung, ketika kelas dasar adalah definisi kelas, antara tupel ditentukan.
Dalam python suksesi beberapa fitur:
Jika kolom lebih dari satu kelas di tuple warisan, maka disebut "multiple inheritance."
sintaks:
Deklarasi kelas turunan, mirip dengan kelas induk mereka, kemudian mewarisi daftar kelas dasar dengan nama kelas, sebagai berikut:
class SubClassName (ParentClass1[, ParentClass2, id.]): 'Optional class documentation string' class_suite
contoh:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Parent: # 定义父类 parentAttr = 100 def __init__(self): print "调用父类构造函数" def parentMethod(self): print '调用父类方法' def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "父类属性 :", Parent.parentAttr class Child(Parent): # 定义子类 def __init__(self): print "调用子类构造方法" def childMethod(self): print '调用子类方法 child method' c = Child() # 实例化子类 c.childMethod() # 调用子类的方法 c.parentMethod() # 调用父类方法 c.setAttr(200) # 再次调用父类的方法 c.getAttr() # 再次调用父类的方法
Kode di atas dijalankan sebagai berikut:
调用子类构造方法 调用子类方法 child method 调用父类方法 父类属性 : 200
Anda dapat mewarisi beberapa kelas
class A: # 定义类 A idid. class B: # 定义类 B idid. class C(A, B): # 继承类 A 和 B idid.
Anda dapat menggunakan issubclass () atau metode isinstance () untuk mendeteksi.
Jika fungsi Anda adalah metode kelas induk tidak dapat memenuhi kebutuhan Anda, Anda dapat menulis ulang metode kelas induk di subclass:
contoh:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Parent: # 定义父类 def myMethod(self): print '调用父类方法' class Child(Parent): # 定义子类 def myMethod(self): print '调用子类方法' c = Child() # 子类实例 c.myMethod() # 子类调用重写方法
Mengeksekusi kode di atas hasil output adalah sebagai berikut:
调用子类方法
Tabel berikut ini berisi beberapa fitur umum yang dapat Anda menimpa di kelas Anda:
Tidak. | Metode ini, dijelaskan hanya panggilan & |
---|---|
1 | __init__ (self [, args id.] ) Cukup memanggilmetode konstruktor:obj = className (args) |
2 | __del __ (self) Destructors, menghapus objek sederhana metodepanggilan:dell obj |
3 | __repr __ (self) Konversi dari bentuk untuk interpreter untuk membaca metode sederhanapanggilan:cetak ulang (obj) |
4 | __str __ (self) Untuk nilai menjadi bentuk yang sesuai untuk membaca manusiapemanggilanmetodesederhana:str (obj) |
5 | __cmp__ (self, x) Objek metode yang relatif sederhanapanggilan:CMP (obj, x) |
Python juga mendukung operator overloading, contoh adalah sebagai berikut:
#!/usr/bin/python class Vector: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return 'Vector (%d, %d)' % (self.a, self.b) def __add__(self,other): return Vector(self.a + other.a, self.b + other.b) v1 = Vector(2,10) v2 = Vector(5,-2) print v1 + v2
Hasil eksekusi kode di atas adalah sebagai berikut:
Vector(7,8)
__private_attrs: mulai dua garis bawah yang menyatakan bahwa properti pribadi dan tidak dapat digunakan atau diakses langsung di kelas eksternal. Diri .__ private_attrs bila digunakan dalam metode kelas.
Dalam interior terestrial, penggunaan def kata kunci dapat didefinisikan sebagai metode kelas dengan definisi umum dari fungsi yang berbeda, metode kelas harus menyertakan parameter diri, dan sebagai parameter pertama
__private_method: dua garis bawah pertama, metode ini dinyatakan sebagai metode swasta di kelas tidak bisa memanggil eksternal. Panggilan private_methods diri .__ dalam kelas
#!/usr/bin/python # -*- coding: UTF-8 -*- class JustCounter: __secretCount = 0 # 私有变量 publicCount = 0 # 公开变量 def count(self): self.__secretCount += 1 self.publicCount += 1 print self.__secretCount counter = JustCounter() counter.count() counter.count() print counter.publicCount print counter.__secretCount # 报错,实例不能访问私有变量
Python dengan mengubah nama untuk menyertakan nama kelas:
1 2 2 Traceback (most recent call last): File "test.py", line 17, in <module> print counter.__secretCount # 报错,实例不能访问私有变量 AttributeError: JustCounter instance has no attribute '__secretCount'
Python tidak diperbolehkan akses kelas instantiated Data pribadi, tetapi Anda dapat menggunakan object._className__attrName akses atribut, kode berikut akan menggantikan baris terakhir dari kode di atas kode:
idididididididididididid. print counter._JustCounter__secretCount
Mengeksekusi kode di atas, hasil pelaksanaan adalah sebagai berikut:
1 2 2 2