Hướng dẫn __new__ trong python
Vài ghi chép vụn vặt... Bài viết dùng python 2.7.5. 1. zip cái tên hàm rất rất rất dễ hiểu nếu bạn biết zip là gì: nó là cái khoá kéo (phéc măng tuya ???). Có 2 dải, và nó sẽ ghép chúng thành từng cặp (tuple). Với function zip, nó có thể zip nhiều list với nhau (2 trở lên, và sẽ cắt ở độ dài của list ngắn nhất - nếu kéo khoá mà 1 bên hết thì phải dừng lại thôi :D) Code (viết trên ipython): In [8]: numbs = range(1,10) In [11]: adjs = ['perfect', 'awesome', 'bloated'] Chú ý: ở dòng [9], tên biến nên đặt là ``names`` thay vì ``name``, tác giả quá lười nên không đổi lại nên đành để vậy. 2. __new__ và __init__ 2.1 Method __init__ Code ví dụ (được viết trên ipython): In [13]: class FAMILUG(object): Giải thích: FAMILUG(): gọi class object FAMILUG, tạo ra một class instance mới của class FAMILUG. Class instance này được gán cho variable fml, hiển nhiên nó cũng là một object (nhắc lại: everything in Python is object) nhưng chỉ gọi là class instance cho ngắn và phân biệt với class object. Do method __init__ tự được gọi nên quá trình tạo class instance này đã in ra chữ ``THON``. Ở đây không giải thíchchi tiết về cách viết method __init__ hay cú pháp của class. Xem thêm ở https://docs.python.org/2/tutorial/classes.html#a-first-look-at-classes NOTICE: phần sau chỉ nên đọc nếu bạn nắm được các khái niệm về OOP trong python. 2.2 Method __new__ Vậy method __new__ là gì? Method __new__ được gọi để tạo ra một instance mới của class đó. Vậy toàn
bộ dòng code ``FAMILUG()`` có thực hiện ít nhất 2 việc sau: Bình thường programmer không cần viết __new__ mà sẽ tự dụng __new__ của class mà nó kế thừa. class Runtime(object): Trong method __new__ trên thực hiện kiểm tra xem class attribute ``instance`` đã được gán giá trị nào chưa, nếu chưa thì tạo một class instance mới, nếu rồi thì trả về class instance đã tồn tại. Do class object Runtime là duy nhất, nên attribute ``instance`` cũng là duy nhất, nó khác với data attribute của class instance (thường được gán self.xyz = blah ở __init__, mỗi class instance đều có thể có giá trị riêng). Chú ý __new__ là static method (giống function bình thường (function viết ở module level) nhưng đặt trong một class - chủ yếu để tổ chức code cho hợp lý), nó không được nhận bất kỳ implicit argument nào (self hay cls). Tham khảo: class method vs static method http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python |