Hướng dẫn python file attributes - thuộc tính tệp python

Mỗi class thường chứa hai loại thành viên quan trọng: thành phần chứa dữ liệu và thành phần xử lý dữ liệu. Trong Python, thành phần chứa dữ liệu được gọi là attribute. Có thể xem attribute của Python tương tự như biến của class trong các ngôn ngữ như C++/Java hay C#.

Nội dung chính

  • Ví dụ về sử dụng attribute trong Python
  • Instance attribute
  • Khai báo instance attribute
  • Truy xuất instance attribute
  • Class attribute
  • Public, protected, private trong Python
  • Kết luận

Python phân biệt hai loại attribute: instance attribute gắn với object và class attribute gắn với chính class.

Ví dụ về sử dụng attribute trong Python

Instance attribute

Khai báo instance attribute

Truy xuất instance attribute

Class attribute

Public, protected, private trong Python

Kết luậnattribute của object b [nhưng không phải là attribute của b2].

Python phân biệt hai loại attribute: instance attribute gắn với object và class attribute gắn với chính class.

Chúng ta bắt đầu với một ví dụ.

Tạo module book.py và viết code như sau:

class Book: """A class for e-book""" b = Book[] b.title = 'Python programming' b.authors = 'Donald Trump' b.year = 2020 print[b.title, b.authors, b.year] # kết quả là 'Python programming Donald Trumo 2020' b2 = Book[] print[b2.title] # lỗi, không có attribute title trong object b2instance attribute của class book.

Instance attribute

Khai báo instance attribute

Truy xuất instance attribute

Khai báo instance attribute

Truy xuất instance attribute

Class attribute

Public, protected, private trong Python

  • Kết luận
  • Python phân biệt hai loại attribute: instance attribute gắn với object và class attribute gắn với chính class.

Chúng ta bắt đầu với một ví dụ.

Tên biến thành viên được đặt theo quy tắc đặt định danh chung của Python, cũng như theo quy ước đặt tên của biến [cục bộ và toàn cục].

Như vậy, self.title = 'A new book' trong __init__[] sẽ tạo ra biến thành viên title với giá trị ‘A new book’.

Tất cả các tham số còn lại của __init__[] chính là để cung cấp giá trị ban đầu cho các biến thành viên.

Như trong ví dụ 1 bạn đã thấy, attribute không nhất thiết phải khai báo trong hàm tạo. Bạn có thể khai báo attribute sau khi tạo object. Chỉ có điều, khi này attribute đó chỉ tồn tại trên object cụ thể đó. Nếu bạn tạo ra object mới, nó sẽ không có attribute như object trước đó.Nếu bạn tạo attribute trong constructor, tất cả object tạo ra sẽ có chung tổ hợp attribute. Điều này phủ hợp với khái niệm class/object trong lập trình hướng đối tượng. Do vậy, bạn luôn nên tạo instance attribute trong constructor.
Nếu bạn tạo attribute trong constructor, tất cả object tạo ra sẽ có chung tổ hợp attribute. Điều này phủ hợp với khái niệm class/object trong lập trình hướng đối tượng. Do vậy, bạn luôn nên tạo instance attribute trong constructor.

Truy xuất instance attribute

Với các instance attribute tạo ra như trên, bạn có thể truy xuất nó qua tên object trong code ở ngoài class như sau:

b3 = Book[''] b3.title = 'Tự học lập trình Python' b3.authors = 'Nhật Linh' b3.publisher = 'Tự học ICT' b3.year = 2021 b3.edition = 2

Việc truy xuất này là hai chiều, nghĩa là có thể gán giá trị hoặc đọc giá trị.

Đối với code ở bên trong class, cách truy cập là tương tự. Hãy xem phương thức to_string[]:

def to_string[self, brief = True]: """Get the infor and make a formated string""" if brief: return f"{self.title} by {self.authors}" else: return f"{self.title} by {self.authors}, {self.edition} edition, {self.publisher}, {self.year}"

Tạm thời chúng ta chưa trình bày kỹ về phương thức này.

Hãy nhìn cách sử dụng biến title, authors, edtion, publisher và year thông qua tham số self: self.title, self.authors, self.edition, self.publisher, self.year.

Bạn không được viết trực tiếp tên attribute mà bắt buộc phải thông qua biến self. Nó không có gì khác biệt so với khi truy xuất từ tên object bên ngoài class, cả về hình thức và bản chất. Tham số self thực chất là một object kiểu Book được Python tự động truyền khi gọi phương thức to_string[].

Class attribute

Hãy hình dung yêu cầu sau: khi xây dựng class Book, làm thế nào để theo dõi số lượng object đã được tạo ra? Logic đơn giản nhất là tạo ra một biến đếm. Mỗi khi tạo một object mới thì tăng giá trị của biến đếm. Nếu biến đếm và việc tăng giá trị của biến đếm nằm ngoài class thì rất đơn giản. Nhưng nếu chúng ta cần tích hợp logic này vào chính class thì làm như thế nào?

Để ý thấy rằng, một biến đếm cho mục đích trên không thể phụ thuộc vào từng object. Nói cách khác, tất cả các object đều phải sử dụng chung một biến đếm. Để tăng giá trị khi tạo object, phép cộng phải được thực hiện trong constructor.

Python cung cấp một công cụ cho những mục đích tương tự: class attribute. Hãy thay đổi class Book như sau:

class Book: """A class for e-book""" count = 0 def __init__[self, title: str, authors: str = '', publisher: str = '', year: int = 2020, edition: int = 1]: """Hàm tạo của class""" self.title = title self.authors = authors self.publisher = publisher self.year = year self.edition = edition self.__private = True Book.count += 1

Để ý dòng 4 có lệnh khởi tạo biến count = 0, và dòng 18 có phép cộng Book.count += 1. Trong class Python, count là một class attribute.

Class attribute là một biến gắn liền với chính class, có thể được truy xuất từ các object và có giá trị chung cho tất cả các object. là một biến gắn liền với chính class, có thể được truy xuất từ các object và có giá trị chung cho tất cả các object.

Sự khác biệt giữa class attribute và instance attribute nằm ở chỗ: instance attribute gắn với từng object cụ thể và thể hiện trạng thái riêng của từng object; class attribute gắn với chính class và đặc trưng cho class, hoặc đặc trưng chung cho mọi object.

Với biến count xây dựng như trên bạn có thể sử dụng nó thông qua tên class: Book.count. Bạn sử dụng lối viết này dù ở trong thân class hay bên ngoài class.

b1 = Book['Lập trình hướng đối tượng với Python', 'Nhật Linh', 'Tự học ict', 2022, 2] print[Book.count] b2 = Book[title = 'Nhập môn lập trình Python', authors= 'Nhật linh', publisher= 'Tự học ICT'] print[Book.count] b3 = Book[''] print[b3.count]

Do đặc điểm của class attribute là sử dụng chung trong các object khác nhau, bạn cũng có thể truy xuất giá trị của count thông qua tên object: b3.count. Tuy nhiên, khi truy xuất qua tên object bạn không thay đổi được giá trị của class attribute. Nói chính xác hơn, thay đổi giá trị của class attribute qua tên object sẽ không lưu lại được.

Public, protected, private trong Python

Trong các ngôn ngữ hướng đối tượng truyền thống như C++, Java hay C#, mỗi thành viên thuộc về một trong các mức truy cập:[1] public: tự do truy cập, không có giới hạn gì[2] protected: chỉ class con và trong nội bộ class mới có thể truy cập[3] private: giới hạn truy cập trong nội bộ class.
[1] public: tự do truy cập, không có giới hạn gì
[2] protected: chỉ class con và trong nội bộ class mới có thể truy cập
[3] private: giới hạn truy cập trong nội bộ class.

Trong Python không có khái niệm về kiểm soát truy cập các thành viên như vậy. Hoặc cũng có thể nói rằng mặc định mọi thành viên của class trong Python đều là public. Nghĩa là code ngoài class có thể tự do truy cập các thành viên này.

Để mô phỏng lại hiệu quả của việc kiểm soát truy cập, Python sử dụng loại kỹ thuật có tên gọi là xáo trộn tên [name mangling].name mangling].

Kỹ thuật này quy ước rằng:

  • Nếu muốn biến chỉ được sử dụng trong nội bộ class và các class con [mức truy cập là protected], tên biến cần bắt đầu là _ [một dấu gạch chân];
  • Nếu muốn biến chỉ được sử dụng trong nội bộ class [mức truy cập private], tên biến cần bắt đầu là __ [hai dấu gạch chân].

Ví dụ, bạn có thể khai báo biến protected và private trong constructor của lớp Book như sau:

self.__private = True # private instance attribute self._protected = False # protected instance attribute

Thực ra, loại kỹ thuật này không làm thay đổi được việc truy cập thành viên của class. Nó đơn thuần là chỉ báo để lập trình viên và IDE biết ý định sử dụng của thành viên đó.

Ví dụ, trong class Book như trên, thực tế biến __private không hề trở thành private. IDE sẽ trợ giúp che đi biến này trong phần nhắc code. Tuy nhiên bạn vẫn có thể truy xuất nó như bình thường: b3.__private = False.

Kết luận

Trong bài học này chúng ta đã xem xét cách sử dụng attribute – thành phần lưu trữ dữ liệu trong class Python.

Python phân biệt hai loại attribute: instance attribute gắn với object, class attribute gắn với chính class. Instance attribute tương tự như biến thành viên của C++/Java/C#, còn class attribut tương tự như biến static của các ngôn ngữ này.

Điểm khác biệt lớn trong Python là instance attribute khai báo trong hàm tạo, còn class attribute khai báo trực tiếp trong class.

Đồng thời, các attribute trong Python không phân biệt mức truy cập [public, protected, private] mà sử dụng kỹ thuật name mangling với vai trò chỉ báo.

+ Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.+ Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.+ Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.Cảm ơn bạn!giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
+ Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
+ Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
Cảm ơn bạn!

Chủ đề