http://vietjack.com/python/index.jsp Copyright © vietjack.com Khái niệm hướng đối tượng Python Python ngơn ngữ lập trình hướng đối tượng Do với bạn học qua C++ quen thuộc với khái niệm hướng đối tượng Chương trình bày sơ qua thuật ngữ liên quan đến hướng đối tượng với ví dụ minh họa giúp bạn dễ hiểu vấn đề trình bày Một số khái niệm hướng đối tượng Lớp: Một nguyên mẫu định nghĩa người dùng cho đối tượng mà định nghĩa tập hợp thuộc tính mà xác định rõ đối tượng lớp Các thuộc tính thành viên liệu (các biến class biến instance) phương thức truy cập thơng qua tốn tử dot (dấu chấm ) Biến class: Đây biến chia sẻ tất instance (sự thể hiện) lớp Các biến class định nghĩa bên lớp bên phương thức lớp Biến class khơng sử dụng thường xuyên biến instance Thành viên liệu: Là biến class biến instance mà giữ liệu liên kết với lớp đối tượng Nạp chồng hàm (overloading): Là phép gán nhiều hành vi tới hàm cụ thể Hoạt động thực đa dạng kiểu đối tượng tham số liên quan Biến instance: Là biến định nghĩa bên phương thức thuộc sở hữu instance lớp Tính kế thừa: Là việc truyền đặc trưng lớp cho lớp khác mà kế thừa từ lớp ban đầu Instance: Là đối tượng riêng lớp Một đối tượng obj mà thuộc lớp Circle instance (sự thể hiện) lớp Circle Trình thuyết minh: Là trình tạo thể lớp Phương thức: Một loại hàm đặc biệt mà định nghĩa phần định nghĩa lớp http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com Đối tượng: Một instance cấu trúc liệu mà định nghĩa lớp Một đối tượng gồm thành viên liệu (biến class biến instance) phương thức Nạp chồng toán tử: Là phép gán nhiều hàm cho toán tử cụ thể Tạo lớp Python Trong Python, lệnh class sử dụng để tạo lớp Tên lớp theo sau từ khóa class theo sau dấu hai chấm, sau: class TenLop: 'Phan documentation string cho lop la y' class_suite Lớp có Documentation String mà truy cập thông quaTenLop. doc class_suite gồm tất lệnh thành phần mà định nghĩa thành viên lớp, cấu trúc liệu hàm Dưới ví dụ đơn giản lớp Python: class Sinhvien: 'Class co so chung cho tat ca sinh vien' svCount = def init (self, ten, hocphi): self.ten = ten self.hocphi = hocphi Sinhvien.svCount += def displayCount(self): print "Tong so Sinh vien %d" % Sinhvien.svCount def displaySinhvien(self): print "Ten : ", self.ten, ", Hoc phi: ", self.hocphi http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com Biến svCount biến class có giá trị chia sẻ tất instance lớp Sinhvien Biến truy cập dạng Sinhvien.svCount từ bên lớp bên lớp Phương thức init () phương thức đặc biệt, constructor lớp phương thức thuyết minh mà Python gọi bạn tạo instance lớp Bạn khai báo phương thức khác hàm thông thường với exception tham số cho phương thức self Python thêm tham số self tới List cho bạn; bạn khơng cần bao bạn gọi phương thức Tạo Instance Python Để tạo instance lớp, bạn gọi lớp sử dụng tên lớp truyền vào tham số mà phương thức init chấp nhận Bạn theo dõi ví dụ sau: "Lenh tao doi tuong dau tien cua lop Sinhvien" sv1 = Sinhvien("Hoang", 4000000) "Lenh tao doi tuong thu hai cua lop Sinhvien" sv2 = Sinhvien("Huong", 4500000) Truy cập thuộc tính Python Bạn truy cập thuộc tính đối tượng sử dụng toán tử dot (dấu chấm) với đối tượng Biến class truy cập sử dụng tên lớp sau: sv1.displaySinhvien() sv2.displaySinhvien() print "Tong so Sinh vien %d" % Sinhvien.svCount Bây đặt tất khái niệm với nhau: class Sinhvien: 'Class co so chung cho tat ca sinh vien' svCount = def init (self, ten, hocphi): http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com self.ten = ten self.hocphi = hocphi Sinhvien.svCount += def displayCount(self): print "Tong so Sinh vien %d" % Sinhvien.svCount def displaySinhvien(self): print "Ten : ", self.ten, ", Hoc phi: ", self.hocphi "Lenh tao doi tuong dau tien cua lop Sinhvien" sv1 = Sinhvien("Hoang", 4000000) "Lenh tao doi tuong thu hai cua lop Sinhvien" sv2 = Sinhvien("Huong", 4500000) sv1.displaySinhvien() sv2.displaySinhvien() print "Tong so Sinh vien %d" % Sinhvien.svCount Khi code thực thi cho kết quả: Ten : Hoang ,Hoc phi: 4000000 Ten : Huong ,Hoc phi: 4500000 Tong so Sinh vien Bạn thêm, xóa, sửa đổi thuộc tính lớp đối tượng thời điểm sv1.tuoi = 21 # Them mot thuoc tinh 'tuoi' sv1.tuoi = 20 # Sua doi thuoc tinh 'tuoi' del sv1.tuoi # Xoa thuoc tinh 'tuoi' Thay sử dụng lệnh thức để truy cập thuộc tính, bạn sử dụng hàm sau: Hàm getattr(obj, name[, default]) : Để truy cập thuộc tính đối tượng Hàm hasattr(obj,name) : Để kiểm tra xem thuộc tính có tồn hay khơng http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com Hàm setattr(obj,name,value) : Để thiết lập thuộc tính Nếu thuộc tính khơng tồn tại, tạo Hàm delattr(obj, name) : Để xóa thuộc tính Ví dụ: hasattr(sv1, 'tuoi') # Tra ve true neu thuoc tinh 'tuoi' ton tai getattr(sv1, 'tuoi') # Tra ve gia tri cua thuoc tinh 'tuoi' setattr(sv1, 'tuoi', 20) # Thiet lap thuoc tinh 'tuoi' la 20 delattr(sv1, 'tuoi') # Xoa thuoc tinh 'tuoi' Các thuộc tính có sẵn cho lớp Python Mỗi lớp Python giữ thuộc tính xây dựng sẵn sau chúng truy cập sử dụng toán tử dot (dấu chấm ) thuộc tính khác: dict : Là Dictionary chứa namespace lớp doc : Được sử dụng để truy cập Documentation String lớp có name : Là tên lớp module : Là tên Module lớp định nghĩa Thuộc tính main chế độ tương tác bases : Là Tuple chứa lớp sở Với lớp Sinhvien trên, thử truy cập tất thuộc tính class Sinhvien: 'Class co so chung cho tat ca sinh vien' svCount = def init (self, ten, hocphi): self.ten = ten self.hocphi = hocphi http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com Sinhvien.svCount += def displayCount(self): print "Tong so Sinh vien %d" % Sinhvien.svCount def displaySinhvien(self): print "Ten : ", self.ten, ", Hoc phi: ", self.hocphi print "Sinhvien. doc :", Sinhvien. doc print "Sinhvien. name :", Sinhvien. name print "Sinhvien. module :", Sinhvien. module print "Sinhvien. bases :", Sinhvien. bases print "Sinhvien. dict :", Sinhvien. dict Khi code thực thi cho kết quả: Sinhvien. doc : Class co so chung cho tat ca sinh vien Sinhvien. name : Sinhvien Sinhvien. module : main Sinhvien. bases : () Sinhvien. dict : {' module ': ' main ', 'displayCount': , 'svCount': 2, 'displaySinhvien': , ' doc ': 'Class co so chung cho tat ca sinh vien', ' init ': } Hủy đối tượng (Trình dọn rác) Python Python hủy đối tượng mà không cần đến (các kiểu xây dựng sẵn instance lớp) cách tự động để giải phóng khơng gian nhớ Tiến trình gọi Garbage Collection thực trình dọn rác Garbage Collector Trình dọn rác Python chạy thực thi chương trình kích hoạt số tham chiếu đối tượng tiến Số tham chiếu đối tượng thay đổi số alias mà trỏ tới thay đổi Số tham chiếu đối tượng tăng gán tên đặt container (chẳng hạn List, Tuple, Dictionary) Số tham chiếu đối tượng giảm bị http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com xóa với lệnh del, tham chiếu tái gán, tham chiếu khỏi phạm vi Khi số tham chiếu đối tượng tiến 0, Python thu thập cách tự động Ví dụ: a = 40 # Tao doi tuong b = a # Tang so tham chieu cua c = [b] # Tang so tham chieu cua del a # Giam so tham chieu cua b = 100 # Giam so tham chieu cua c[0] = -1 # Giam so tham chieu cua Thường bạn khơng ý trình dọn rác hủy instance giải phóng nhớ Nhưng lớp triển khai phương thức đặc biệt del (), gọi destructor, mà triệu hồi instance chuẩn bị hủy Phương thức sử dụng để xóa nguồn nhớ sử dụng instance Ví dụ del () destructor in tên lớp instance mà chuẩn bị hủy 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, "destroyed" pt1 = Point() pt2 = pt1 pt3 = pt1 print id(pt1), id(pt2), id(pt3) # in id cua doi tuong del pt1 del pt2 http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com del pt3 Khi code thực thi cho kết sau: 3083401324 3083401324 3083401324 Point destroyed Ghi chú: Một cách lý tưởng bạn nên định nghĩa lớp bạn file riêng biệt, sau bạn nên import chúng file chương trình sử dụng lệnh import Kế thừa lớp Python Thay bắt đầu viết code cho lớp mới, bạn tạo lớp việc kế thừa từ lớp tồn trước cách liệt kê lớp cha cặp dấu ngoặc đơn sau tên lớp Lớp kế thừa thuộc tính lớp cha nó, bạn sử dụng thuộc tính thể chúng định nghĩa lớp Một lớp ghi đè thành viên liệu phương thức từ lớp cha Cú pháp Các lớp kế thừa khai báo giống lớp cha nó; nhiên, danh sách lớp sở để kế thừa từ cung cấp sau tên lớp class Tenlopcon (LopCha1[, LopCha2, ]): 'Phan documentation string cua Class la y' class_suite Ví dụ class Parent: # dinh nghia lop cha parentAttr = 100 def init (self): print "Goi constructor cua lop cha" def parentMethod(self): print 'Goi phuong thuc cua lop cha' http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "Thuoc tinh cua lop cha :", Parent.parentAttr class Child(Parent): # dinh nghia lop def init (self): print "Goi constructor cua lop con" def childMethod(self): print 'Goi phuong thuc cua lop con' c = Child() # instance cua lop c.childMethod() # lop goi phuong thuc cua no c.parentMethod() # goi phuong thuc cua lop cha c.setAttr(200) # tiep tuc goi phuong thuc cua lop cha c.getAttr() # tiep tuc goi phuong thuc cua lop cha Khi code thực thi cho kết sau: Goi constructor cua lop Goi phuong thuc cua lop Goi phuong thuc cua lop cha Thuoc tinh cua lop cha : 200 Theo cách tương tự, bạn kế thừa lớp từ nhiều lớp cha sau: class A: # dinh nghia lop A class B: # dinh nghia lop B class C(A, B): # lop cua A va B http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/python/index.jsp Copyright © vietjack.com Bạn sử dụng hàm issubclass() isinstance() để kiểm tra mối quan hệ hai lớp instance Hàm issubclass(sub, sup) trả true lớp sub cho thực lớp lớp cha sup Hàm isinstance(obj, Class) trả true obj instance lớp Class instance lớp Class Ghi đè phương thức Python Bạn ghi đè phương thức lớp cha Một lý để thực việc ghi đè phương thức lớp cha bạn muốn có tính khác biệt đặc biệt lớp Ví dụ class Parent: # dinh nghia lop cha def myMethod(self): print 'Goi phuong thuc cua lop cha' class Child(Parent): # dinh nghia lop def myMethod(self): print 'Goi phuong thuc cua lop con' c = Child() # instance cua lop c.myMethod() # lop goi phuong thuc duoc ghi de Kết là: Goi phuong thuc cua lop Nạp chồng phương thức Python Bảng liệt kê số tính chung mà bạn ghi đè lớp riêng bạn http://vietjack.com/ Trang chia sẻ học online miễn phí Page 10 http://vietjack.com/python/index.jsp STT Phương thức, Miêu tả Lời gọi mẫu init ( self [,args ] ) Là constructor (với tham số tùy ý nào) Lời gọi mẫu : obj = tenLop(args) del ( self ) Là destructor, xóa đối tượng Lời gọi mẫu : del obj repr ( self ) Biểu diễn chuỗi ước lượng Lời gọi mẫu : repr(obj) str ( self ) Biểu diễn chuỗi in Lời gọi mẫu : str(obj) cmp ( self, x ) So sánh đối tượng Lời gọi mẫu : cmp(obj, x) Copyright © vietjack.com Nạp chồng tốn tử Python Giả sử bạn tạo lớp Vector để biểu diễn vector hai chiều Điều xảy bạn sử dụng toán tử cộng (+) để cộng chúng? Có thể nói vui rằng, lúc Python la hét vào mặt bạn Tuy nhiên, bạn định nghĩa phương thức add_ lớp bạn để thực phép cộng vector sau phép cộng vector vận hành bạn mong đợi Ví dụ class Vector: def init (self, a, b): self.a = a http://vietjack.com/ Trang chia sẻ học online miễn phí Page 11 http://vietjack.com/python/index.jsp Copyright © vietjack.com 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 Kết là: Vector(7,8) Ẩn liệu (Data Hiding) Python Các thuộc tính đối tượng khơng thể nhìn thấy với bên phần định nghĩa lớp Bạn cần đặc tên thuộc tính với tiền tố hai dấu gạch dưới, sau thuộc tính khơng nhìn thấy với bên ngồi Ví dụ class JustCounter: secretCount = def count(self): self. secretCount += print self. secretCount counter = JustCounter() counter.count() counter.count() http://vietjack.com/ Trang chia sẻ học online miễn phí Page 12 http://vietjack.com/python/index.jsp Copyright © vietjack.com print counter. secretCount Kết là: Traceback (most recent call last): File "test.py", line 12, in print counter. secretCount AttributeError: JustCounter instance has no attribute ' secretCount' Python bảo vệ thành viên cách thay đổi nội tên để bao tên lớp Bạn truy cập thuộc tính dạng doi_tuong._tenLop tenThuocTinh Nếu bạn thay dòng cuối sau, làm việc cho bạn print counter._JustCounter secretCount Kết là: 2 http://vietjack.com/ Trang chia sẻ học online miễn phí Page 13 ... phi: ", self.hocphi "Lenh tao doi tuong dau tien cua lop Sinhvien" sv1 = Sinhvien("Hoang", 4000000) "Lenh tao doi tuong thu hai cua lop Sinhvien" sv2 = Sinhvien( "Huong" , 4500000) sv1.displaySinhvien()... Sinhvien" sv1 = Sinhvien("Hoang", 4000000) "Lenh tao doi tuong thu hai cua lop Sinhvien" sv2 = Sinhvien( "Huong" , 4500000) Truy cập thuộc tính Python Bạn truy cập thuộc tính đối tượng sử dụng tốn... 'Goi phuong thuc cua lop con' c = Child() # instance cua lop c.childMethod() # lop goi phuong thuc cua no c.parentMethod() # goi phuong thuc cua lop cha c.setAttr(200) # tiep tuc goi phuong thuc