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,

berorientasi objek Python

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.


Berorientasi Objek Ikhtisar Teknologi

  • Kelas (kelas): digunakan untuk menggambarkan koleksi memiliki sifat dan metode objek yang sama. Ini mendefinisikan satu set properti dan metode umum untuk setiap objek. Objek adalah contoh kelas.
  • variabel kelas: variabel kelas umum di seluruh objek yang dipakai. variabel kelas didefinisikan dan luar fungsi di kelas di. variabel kelas biasanya tidak digunakan sebagai variabel instance.
  • data anggota: variabel kelas atau variabel misalnya untuk kelas pengolahan data yang terkait dan contoh objek.
  • Menggantikan: Jika Anda tidak dapat memenuhi kebutuhan subclass mewarisi dari metode kelas induk, dapat ditulis ulang, sebuah proses yang disebut metode overlay (override), juga dikenal sebagai metode utama.
  • Contoh variabel: variabel didefinisikan dalam metode, hanya peran kelas contoh saat.
  • Warisan: Itu adalah kelas turunan (kelas turunan) mewarisi kelas dasar (base class) bidang dan metode. Warisan juga memungkinkan sebuah objek kelas turunan sebagai objek memperlakukan kelas dasar. Sebagai contoh, ada desain seperti: jenis objek yang berasal dari kelas Dog Animal, yang merupakan analog "adalah (adalah-a)" hubungan (Gambar contoh, adalah Dog Animal).
  • Instantiate: membuat sebuah instance dari kelas, kelas objek tertentu.
  • Metode: Fungsi kelas-didefinisikan.
  • Obyek: Data struktur misalnya melalui definisi kelas. objek data termasuk dua anggota (kelas dan instance variabel) dan metode.

membuat kelas

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.

contoh

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
  • variabel empCount adalah variabel kelas, nilainya akan dibagi antara semua contoh kelas ini. Anda dapat menggunakan akses Employee.empCount dalam kelas atau di luar kelas.
  • Metode pertama __init __ () metode adalah metode metode khusus, konstruktor atau inisialisasi kelas disebut ketika menciptakan sebuah instance dari kelas ini akan memanggil metode

Buat instance dari objek

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)

Properti akses

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:

  • getattr (obj, nama [, default]): properti akses objek.
  • hasattr (obj, nama): Periksa apakah ada atribut.
  • setattr (obj, nama, nilai): mengatur properti. Jika properti tidak ada, membuat properti baru.
  • delattr (obj, nama): menghapus atribut.
hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(empl, 'age')    # 删除属性 'age'

Python atribut class built-in

  • __dict__: atribut kelas (termasuk kamus, data atribut komposisi kelas)
  • __doc__: kelas dokumen tali
  • __name__: nama kelas
  • __module__: modul mana definisi kelas (nama lengkap '. __main __ className', jika kelas terletak di mymod modul diimpor, kemudian className .__ mymod module__ sama)
  • __bases__: Semua kelas dari elemen induk (terdiri dari kelas induk yang terdiri dari semua tupel)

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>}

objek python hancur (pengumpulan sampah)

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.

contoh

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,

warisan kelas

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:

  • 1: Dalam konfigurasi sebagai berikut (__init __ () metode) kelas Cheng Zhongji tidak akan otomatis dipanggil, ia membutuhkan yang mengkhususkan diri pribadi disebut dalam konstruktor kelas turunan.
  • 2: Ketika Anda memanggil metode kelas dasar, Anda perlu menambahkan awalan nama kelas dari kelas dasar, dan kebutuhan untuk membawa variabel parameter diri. Tidak perlu membawa parameter diri berbeda dari fungsi panggilan biasa di kelas
  • 3: Python selalu pertama menemukan jenis yang sesuai pendekatan, jika tidak dapat menemukan metode yang sesuai dalam kelas turunan, itu mulai terlihat satu per satu untuk kelas dasar. (Metode pertama panggilan untuk menemukan di kelas ini, hanya untuk menemukan untuk menemukan kelas dasar).

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.

  • issubclass () - Fungsi Boolean untuk menentukan apakah kelas adalah subclass dari kelas lain atau sintaks kelas keturunan: issubclass (sub, sup)
  • isinstance (obj, Kelas) fungsi Boolean jika obj adalah sebuah contoh dari kelas objek atau contoh Kelas objek Class adalah subclass mengembalikan nilai true.

metode menimpa

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:

调用子类方法

metode Yayasan kelebihan beban

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)

Overloading Operator

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)

atribut kelas dan metode

kelas milik pribadi

__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.

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

metode pribadi kelas

__private_method: dua garis bawah pertama, metode ini dinyatakan sebagai metode swasta di kelas tidak bisa memanggil eksternal. Panggilan private_methods diri .__ dalam kelas

contoh

#!/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
berorientasi objek Python
10/30