Python là một ngôn ngữ hướng đối tượng, nếu bạn nào đã từng học Java thì nó cũng giống như vậy.
1. Định nghĩa Class
Class là một lớp có chứa bên trong các thuộc tính và phương thức của một đối tượng, class trong Python thì cũng giống class trong Java
2. Cú pháp định nghĩa một Class
Kiểu đơn giản nhất để định nghĩa một class, có thể viết như sau:
Các câu lệnh trong một class thường là các định nghĩa của hàm (def), nhưng các câu lệnh khác vẫn có thể sử dụng. Đối tượng lớp sẽ được tạo ra ngay sau khi định nghĩa lớp được kết thúc.
3. Đối tượng Class
Các đối tượng class hỗ trợ hai tác vụ: tham chiếu thuộc tính và tạo thực thể class (instantiation)
3.1 Tham chiếu thuộc tính
Dùng cú pháp chuẩn cho mọi tham chiếu thuộc tính trong Python:
Các tên thuộc tính hợp lệ gồm tất cả các thuộc tính trong class khi đối tượng class được tạo ra.
Xét ví dụ 1:
Ở ví dụ trên thì test().a và test().k là những tham chiếu thuộc tính hợp lệ, theo thứ tự nó trả về một chuỗi và một đối tượng hàm. Biến __doc__cũng là một thuộc tính hợp lệ, lúc này tham chiếu thuộc tính test().__doc__ sẽ trả về chuỗi tài liệu của class "This is test class"
Note1: Chú ý là tên của class có thể có cặp dấu () hoặc không đều được.
Note2: Chú ý *self* ở đây giống con trỏ *this* trong Java chứ không phải tham số truyền vào và *self* là bắt buộc phải có trong phương thức.
3.2 Class instantiation (tạo thực thể class): giống như cách viết khi gọi hàm.
Với ví dụ 1 ở trên ta có:
Lúc này ta có thể hiểu x là một đối tượng class mới và gán đối tượng này vào biến x và ta có thể truy xuất đến các thuộc tính bên trong class như bình thường.
Tác vụ tạo thực thể class tạo một đối tượng rỗng. Nhiều class mục đích là để tạo ra các đối tượng với các thực thể thỏa mãn một trạng thái khởi tạo xác định. Vì vậy một class có thể định nghĩa một phương thức đặc biệt tên __init__() như sau:
Khi một class định nghĩa một phương thức __init__(), việc tạo thực thể class sẽ tự động gọi __init__() ở thực thể class vừa được tạo.
Cái này mình thấy giống phương thức khởi tạo - constructor trong Java này, bạn nào còn nhớ không nhỉ
Trong ví dụ này, một thực thể class đã khởi tạo mới có thể được tạo ra từ
Tất nhiên là __init__() có thể nhận thêm tham số. Trong trường hợp đó, các tham số đưa vào phép tạo thực thể class sẽ được truyền vào__init__(). Theo dõi ví dụ 2 dưới đây:
Ở ví dụ này ta thấy phương thức khởi tạo nhận 2 tham số là para1 và para2, vì vậy class example cũng sẽ nhận 2 tham số đầu vào.
4. Các đối tượng thực thể
Tác vụ duy nhất mà các đối tượng thực thể hiểu được là tham chiếu thuộc tính. Có hai loại thuộc tính hợp lệ đó là: thuộc tính dữ liệu và phương thức.
4.1 Thuộc tính dữ liệu
Không cần được khai báo, giống như các biến cục bộ, chúng tự động tồn tại khi được gán vào, ví dụ nếu x là một thực thể của test được tạo ra ở trên thì giá trị được trả về của đoạn mã dưới đây là 324
4.2 Phương thức
Là một hàm thuộc một đối tượng. Các tên phương thức hợp lệ của một đối tượng thực thể phụ thuộc vào class của nó. Theo định nghĩa, mọi thuộc tính của một class là những đối tượng hàm định nghĩa các phương thức tương ứng của các thực thể của class đó. Trong ví dụ 1 test.klà một hàm còn x.k là một đối tượng phương thức, không phải một đối tượng hàm.
5 . Đối tượng phương thức
Thông thường, một phương thức được gọi ngay sau khi nó được khởi tạo.
Trong test nó sẽ là về chuỗi 'Hello Ksec'. Tuy nhiên cũng không cần thiết phải gọi 1 phương thức theo cách trên, vì x.k là một đối tượng phương thức nên có thể được lưu lại và gọi ở một lần khác, xem ví dụ 3:
Đoạn mã trên sẽ thực hiện in ra dòng chữ 'Hello Ksec' 10 lần.
6. Tính kế thừa
6.1 Kế thừa đơn
Trong Python không có khái niệm Protected như C++ hay Java, chỉ có các hàm, dữ liệu thành phần Public hoặc Private, và chúng được phân biệt qua tên. Những tên bắt đầu bằng __ (2 dấu gạch dưới) và kết thúc có tối đa là _ (1 dấu gạch dưới) là Private.
Eg: __x, __abc_, __xyz là những biến Private còn __y__, a, xyz__ là những biến Public. Với tên hàm cũng quy định như vậy.
Các biến và phương thức Private chỉ có thể truy cập trong class đó, các biến và phương thức Public có thể truy xuất trên toàn bộ chương trình và chỉ có một loại kế thừa là Public.
Cú pháp khai báo một lớp kế thừa như sau:
Ta xét ví dụ:
Như ta thấy ở ví dụ trên, class ksec có một thuộc tính Public là sk và một thuộc tính Private là __pr. Các thuộc tính Public thì class consub_class có thể truy xuất bình thường, nhưng khi truy xuất đến thuộc tính Private của class ksec thì báo lỗi không truy xuất được. Một điểm chú ý nữa là hàm khởi tạo của sub_class không tự gọi hàm khởi tạo của ksec, do đó lập trình viên phải gọi hàm khởi tạo của ksec.
6.2 Đa kế thừa
Khai báo đa kế thừa cũng gần giống như đơn kế thừa, chỉ việc thêm danh sách các lớp cơ sở (lớp cha) vào trong cặp dấu () sau tên lớp:
Do Python không tự gọi hàm khởi tạo của các lớp cha nên thứ tự kế thừa không quan trọng.
Xét ví dụ đa kế thừa sau:
Lúc này class con ksecClub có thể truy xuất đến các thuộc tính Public của 2 class cha như sk1, sk2.
7. Các kỹ thuật về nạp chồng hàm, chồng toán tử, hàm và dữ liệu thành phần tĩnh
7.1. Nạp chồng hàm trong class (Overload)
Python không hỗ trợ nạp chồng hàm trong class khi mà không có một khai báo chặt chẽ về kiểu của dữ liệu các tham số truyền cho hàm, kiểu của chúng được xác định tùy theo giá trị truyền vào hàm lúc gọi hàm.
7.2 Nạp chồng toán tử
Nạp chồng toán tử trong Python được thực hiện bằng việc khai báo đè lên 1 số tên đặc biệt. Có rất nhiều toán tử có thể nạp chồng trong Python.
Eg: Phương thức __add__(self,x) sẽ định nghĩa lại phép cộng, __sub__(self,x) sẽ định nghĩa lại phép trừ ...
Xét ví dụ:
7.3 Hàm và dữ liệu thành phần tĩnh
1. Định nghĩa Class
Class là một lớp có chứa bên trong các thuộc tính và phương thức của một đối tượng, class trong Python thì cũng giống class trong Java
2. Cú pháp định nghĩa một Class
Kiểu đơn giản nhất để định nghĩa một class, có thể viết như sau:
Code:
class TenClass: <Câu lệnh 1> . . <Câu lệnh n>
3. Đối tượng Class
Các đối tượng class hỗ trợ hai tác vụ: tham chiếu thuộc tính và tạo thực thể class (instantiation)
3.1 Tham chiếu thuộc tính
Dùng cú pháp chuẩn cho mọi tham chiếu thuộc tính trong Python:
Code:
object.name
Xét ví dụ 1:
Code:
class test: "This is test class" a = 'ksec.info' def k(self): return 'Hello Ksec'
Note1: Chú ý là tên của class có thể có cặp dấu () hoặc không đều được.
Note2: Chú ý *self* ở đây giống con trỏ *this* trong Java chứ không phải tham số truyền vào và *self* là bắt buộc phải có trong phương thức.
3.2 Class instantiation (tạo thực thể class): giống như cách viết khi gọi hàm.
Với ví dụ 1 ở trên ta có:
Code:
x = test()
Code:
x.a x.k() x.__doc__
Code:
def __init__(self): self.data = []
Cái này mình thấy giống phương thức khởi tạo - constructor trong Java này, bạn nào còn nhớ không nhỉ
Trong ví dụ này, một thực thể class đã khởi tạo mới có thể được tạo ra từ
Code:
x = test()
Code:
>>> class example: def __init__(self, para1, para2): self.p1 = para1 self.p2 = para2 >>> x = example('ksec','.info' ) >>> x.p1, x.p2 ('ksec', '.info')
4. Các đối tượng thực thể
Tác vụ duy nhất mà các đối tượng thực thể hiểu được là tham chiếu thuộc tính. Có hai loại thuộc tính hợp lệ đó là: thuộc tính dữ liệu và phương thức.
4.1 Thuộc tính dữ liệu
Không cần được khai báo, giống như các biến cục bộ, chúng tự động tồn tại khi được gán vào, ví dụ nếu x là một thực thể của test được tạo ra ở trên thì giá trị được trả về của đoạn mã dưới đây là 324
Code:
x.counter = 12 while x.counter < 121: x.counter = x.counter * 3 print x.counter
Là một hàm thuộc một đối tượng. Các tên phương thức hợp lệ của một đối tượng thực thể phụ thuộc vào class của nó. Theo định nghĩa, mọi thuộc tính của một class là những đối tượng hàm định nghĩa các phương thức tương ứng của các thực thể của class đó. Trong ví dụ 1 test.klà một hàm còn x.k là một đối tượng phương thức, không phải một đối tượng hàm.
5 . Đối tượng phương thức
Thông thường, một phương thức được gọi ngay sau khi nó được khởi tạo.
Code:
x.k()
Code:
xk = x.k for i in xrange(10): print xk()
6. Tính kế thừa
6.1 Kế thừa đơn
Trong Python không có khái niệm Protected như C++ hay Java, chỉ có các hàm, dữ liệu thành phần Public hoặc Private, và chúng được phân biệt qua tên. Những tên bắt đầu bằng __ (2 dấu gạch dưới) và kết thúc có tối đa là _ (1 dấu gạch dưới) là Private.
Eg: __x, __abc_, __xyz là những biến Private còn __y__, a, xyz__ là những biến Public. Với tên hàm cũng quy định như vậy.
Các biến và phương thức Private chỉ có thể truy cập trong class đó, các biến và phương thức Public có thể truy xuất trên toàn bộ chương trình và chỉ có một loại kế thừa là Public.
Cú pháp khai báo một lớp kế thừa như sau:
Code:
class SubClass(ParentClass): <Câu lệnh 1> . . <Câu lệnh n>
Code:
>>>class ksec: sk = 'This is string of parent class ksec' __pr = 'This is private var of parent class ksec' def __init__(self): print('This is constructor of ksec') >>>class sub_class(ksec): ss = 'This is string of subclass' def __init__(self): print ('this is constructor of subclass') >>>sb = sub_class() this is constructor of subclass >>>sb.sk 'This is string of parent class ksec' >>>sb.ss 'This is string of subclass' >>>sb.__pr Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> sb.__pr AttributeError: sub_class instance has no attribute '__pr'
6.2 Đa kế thừa
Khai báo đa kế thừa cũng gần giống như đơn kế thừa, chỉ việc thêm danh sách các lớp cơ sở (lớp cha) vào trong cặp dấu () sau tên lớp:
Code:
class sub_class(parentClass1, parentclass2...): <Câu lệnh 1> . . <Câu lệnh 2>
Xét ví dụ đa kế thừa sau:
Code:
class k1: sk1 = 'this is string of k1' def __init__(self): print ('this is constructor of k1') class k2: sk2 = 'this is string of k2' def __init__(self): print ('this is constructor of k2') class ksecClub(k1, k2): sksec = 'this is string of Ksec' def __init__(self): print ('this is constructor of Ksec') >>>kc = ksecClub() 'this is constructor of Ksec' >>>kc.sk1 'this is string of k1' >>>kc.sk2 'this is string of k2' >>>kc.sksec 'this is string of Ksec'
7. Các kỹ thuật về nạp chồng hàm, chồng toán tử, hàm và dữ liệu thành phần tĩnh
7.1. Nạp chồng hàm trong class (Overload)
Python không hỗ trợ nạp chồng hàm trong class khi mà không có một khai báo chặt chẽ về kiểu của dữ liệu các tham số truyền cho hàm, kiểu của chúng được xác định tùy theo giá trị truyền vào hàm lúc gọi hàm.
7.2 Nạp chồng toán tử
Nạp chồng toán tử trong Python được thực hiện bằng việc khai báo đè lên 1 số tên đặc biệt. Có rất nhiều toán tử có thể nạp chồng trong Python.
Eg: Phương thức __add__(self,x) sẽ định nghĩa lại phép cộng, __sub__(self,x) sẽ định nghĩa lại phép trừ ...
Xét ví dụ:
Code:
>>>class K: x = 2 y = 4 def __add__(self, t): self.x += t self.y += t >>> t <__main__.K instance at 0x02061C38> >>> t = K() >>> t.x 2 >>> t.y 4 >>> t+1 >>> t.x 3 >>> t.y 5
No comments:
Post a Comment