Khi nào nên sử dụng thuộc tính lớp python

Cho đến bây giờ, chúng tôi chỉ thảo luận về các câu hỏi lập trình Linux và C. Gần đây tại Trường Holberton, chúng tôi bắt đầu học Python. Ngôn ngữ lập trình này do Guido Van Rossum tạo ra và phát hành năm 1991, là một trong những ngôn ngữ phổ biến và được sử dụng nhiều nhất hiện nay. Trong số nhiều lý do khiến các nhà phát triển yêu thích nó, thực tế là một trong những mô hình của nó là OOP. OOP là viết tắt của “Lập trình hướng đối tượng”. Trong OOP, dữ liệu được tổ chức và tập hợp lại trong các đối tượng [hoặc các lớp trong trường hợp của Python], chứa các trường, còn được gọi là thuộc tính, cũng như các phương thức, tương tự như các hàm. Điều này cho phép chúng tôi có nhiều mã dễ đọc, di động và mô-đun hơn

Khi tạo ra Python, Guido Van Rossum muốn nó trở thành “mọi thứ hạng nhất”, nghĩa là mọi thứ sẽ là một đối tượng có trạng thái bình đẳng. Do đó, mọi thứ [hoặc gần như] trong Python là một lớp. Về cơ bản, một lớp bao gồm một khối các câu lệnh thụt vào, chứa các thuộc tính, phương thức, thuộc tính và những thứ khác mà chúng ta sẽ không thảo luận ở đây. Ví dụ: danh sách [tương tự như mảng C] là một lớp, với các phương thức được xác định trước để xây dựng và sửa đổi chúng. Nhưng chúng ta cũng có thể xây dựng các lớp của riêng mình để sử dụng trong mã của mình

Hôm nay, chúng ta sẽ tập trung vào các thuộc tính. Có thể có một số thể hiện của cùng một lớp và các thuộc tính có thể thuộc về một thể hiện duy nhất hoặc thuộc về chính lớp đó. Để minh họa điều này, chúng ta sẽ xây dựng một lớp gọi là Person. Mỗi người là một thể hiện khác nhau của lớp Người. Tất cả mọi người đều có thuộc tính, chẳng hạn như tóc hoặc màu mắt và thuộc tính của mỗi người khác với thuộc tính của người khác

Hiện tại, chúng ta hãy đặt một câu lệnh “pass” để biến nó thành một lớp trống

class Person:
pass

Một chút bối cảnh về các thuộc tính

Trước khi đi sâu vào chủ đề chính của chúng ta, chúng ta hãy ghi nhớ một số điều về các thuộc tính

Attributes define a property or feature of a class. They can be variables, which are fields, or methods, which are functions defined inside the class that can be called this way: ..

Các thuộc tính có thể là công khai, được bảo vệ hoặc riêng tư. Không đi vào quá nhiều chi tiết về ba cấp độ thuộc tính đó, điều quan trọng cần biết là

  • Các thuộc tính riêng tư chỉ có thể được sử dụng và sửa đổi bên trong lớp. Tên của họ được đặt trước bởi “__”
  • Các thuộc tính được bảo vệ có thể được sử dụng bên ngoài lớp, nhưng chỉ trong một số điều kiện nhất định. Tên của họ được đặt trước bởi “_”
  • Các thuộc tính công khai có thể được sử dụng và sửa đổi bởi mọi người, bên trong và bên ngoài lớp

Trong bài viết này, để đơn giản, chúng ta sẽ chủ yếu sử dụng thuộc tính public

Thuộc tính lớp là gì?

Thuộc tính lớp là thuộc tính thuộc về chính lớp đó. Nó được chia sẻ bởi tất cả các thể hiện của lớp đó, nó sẽ có cùng giá trị cho bất kỳ thể hiện nào. Hãy xem một ví dụ

Nếu chúng ta thực hiện những dòng này, chúng ta sẽ thấy đầu ra này

I am a class attribute
I am a class attribute
I am a class attribute

Có, cả ba câu lệnh in đều in cùng một nội dung bởi vì cả hai phiên bản của Person và Person đều có thuộc tính lớp class_attr

Thuộc tính thực thể là gì?

Thuộc tính thể hiện là một thuộc tính thuộc về một thể hiện của một lớp và chỉ có thể truy cập được trong phạm vi của thể hiện đó. Hãy minh họa điều này với lớp Person của chúng ta

Điều này sẽ tạo ra đầu ra sau

I am a new class attribute of the Person class
I am an instance attribute belonging to person_1

Ở đây chúng ta đã thay đổi thuộc tính class class_attr, vì vậy chúng ta sẽ nghĩ rằng in cùng một thuộc tính của một thể hiện của cùng một lớp sẽ in ra chuỗi đã thay đổi này, nhưng thực ra, person_1 vẫn là thể hiện chúng ta đã tạo trước khi thay đổi thuộc tính lớp, vì vậy class_attr của nó là

Sự khác biệt giữa các thuộc tính của Class và Instance là gì

Như chúng ta đã thấy trong ví dụ của mình, các thuộc tính lớp và thể hiện là khác nhau. Các thuộc tính lớp có thể truy cập được đối với tất cả các phiên bản của lớp, trong đó các thuộc tính thể hiện chỉ có thể truy cập được đối với phiên bản cụ thể đó của lớp. Chúng ta có thể truy cập một thuộc tính lớp thông qua một thể hiện hoặc tên lớp, trong khi một thuộc tính thể hiện chỉ có thể được truy cập thông qua thể hiện mà nó thuộc về

Làm thế nào chúng ta có thể tạo ra chúng và cách Pythonic là gì?

Như chúng ta đã thấy trước đó, chúng ta đã tạo các thuộc tính lớp bằng cách khai báo chúng và gán giá trị cho chúng bên trong lớp, bên ngoài các phương thức của lớp đó. Theo truyền thống, nó được thực hiện ở đầu lớp, trước mọi thứ khác

Chúng tôi cũng đã tạo các thuộc tính thể hiện bằng cách chỉ khai báo chúng và gán giá trị cho chúng bên ngoài lớp. Có một cách khác để làm điều đó, sử dụng phương thức __init__. Đó là một phương thức khởi tạo được gọi tự động sau khi một thể hiện của một lớp được tạo. Nó thường là phương thức đầu tiên được định nghĩa bên trong một lớp. Đây là một cách Pythonic hơn để làm điều đó. Hãy sử dụng ví dụ của chúng tôi và thêm thuộc tính tên vào Person

Lưu ý từ khóa bản thân. Nó đề cập đến thể hiện hoặc đối tượng hiện tại của lớp. Bây giờ chúng ta có thể tạo một thể hiện mới của Person theo cách này

person_1 = Person['Laura']

Phương thức __init__ sẽ được gọi và tên thuộc tính thể hiện sẽ được đặt thành 'Laura'. Về cơ bản, nó giống như sinh ra một người và gọi họ là Laura. tên là một thuộc tính thể hiện vì tên Laura không được chia sẻ bởi tất cả những người khác trên Trái đất [còn gọi là các thể hiện khác của lớp Người]

Lưu ý rằng thuộc tính lớp của chúng tôi class_attr vẫn còn đó và vẫn có thể được truy cập theo cách này

person_1.class_attr

Ngoài ra, chúng ta có thể định nghĩa các phương thức getter và setter, tương ứng sẽ lấy giá trị và đặt giá trị của thuộc tính thể hiện riêng. Bạn có nhớ khi chúng tôi nói rằng các thuộc tính riêng tư chỉ có thể truy cập được từ bên trong lớp không? . Đến lượt phương thức __init__ sẽ gọi phương thức setter hoặc thuộc tính để đặt giá trị của thuộc tính. Các getters và setters này là một phần của nguyên tắc đóng gói dữ liệu, có nghĩa là các chi tiết bên trong lớp bị ẩn khỏi người dùng. Trong Python, nên sử dụng chúng làm thuộc tính hơn là phương thức, vì vậy chúng tôi sẽ chỉ đề cập đến các thuộc tính ở đây. Hãy xem cách thực hiện

Wow, chúng tôi đã thêm rất nhiều thứ. Đầu tiên, các dòng đứng trước @ là các trang trí. Chúng cho phép lớp biết nơi cần tìm khi cần truy xuất hoặc đặt giá trị của một thuộc tính. Sau đó, chúng tôi sử dụng từ self để chỉ phiên bản hiện tại và truy cập các thuộc tính của nó. Sau đó, chúng ta có thể thấy rằng cả thuộc tính và phương thức setter đều có cùng tên, nhưng các đối số khác nhau. Điều này là do khi chúng ta tạo một thể hiện mới của Person, chúng ta có thể làm điều này

person_1 = Person['Laura']
print[person_1.name]

Dòng đầu tiên sẽ gọi phương thức __init__, phương thức này sẽ gọi phương thức setter, phương thức này sẽ kiểm tra xem loại đối số được truyền cho nó có phải là chuỗi hay không, sau đó đặt thuộc tính thể hiện thành 'Laura'. Dòng thứ hai sẽ biết in giá trị của thuộc tính private name bằng cách gọi thuộc tính name[]

Another way of knowing if we’re dealing with class or instance attributes is to use either . or self.. That means that in our example if we were to write Person.class_attr inside the class, we would be accessing the class attribute. But if we were to write self.class_attr, we would still be accessing the class attribute but as an instance attribute. It would just create an instance attribute for that instance that is represented by self but with the same name as the class attribute.

Ưu điểm và nhược điểm của các thuộc tính lớp và trường hợp là gì?

Ưu điểm của thuộc tính lớp

  • Tất cả các thể hiện của lớp kế thừa chúng từ lớp
  • Họ lưu trữ dữ liệu có liên quan đến tất cả các trường hợp. Ví dụ: chúng ta có thể có một thuộc tính lớp bộ đếm tăng lên mỗi khi chúng ta tạo một thể hiện mới và giảm đi mỗi khi chúng ta xóa một thể hiện. Bằng cách này, chúng tôi luôn có thể theo dõi xem có bao nhiêu phiên bản của cùng một lớp mà chúng tôi đã tạo

Nhược điểm của thuộc tính lớp

  • Nó có thể trở nên lộn xộn khi bạn tạo một phiên bản trong đó giá trị của thuộc tính lớp khác với giá trị thuộc tính lớp, sau đó cố truy xuất nó qua một phiên bản khác. Hành vi nhanh chóng trở nên bất ngờ
  • Không thể có hai phiên bản với các giá trị khác nhau. Vì vậy, bạn không thể sử dụng chúng để làm những việc khác nhau trên các đối tượng khác nhau. Nếu lớp Người chỉ có các thuộc tính lớp, chúng ta sẽ không thể tạo danh sách liên hệ với những người khác nhau trong đó

Ưu điểm của thuộc tính thể hiện

  • Chúng dành riêng cho một đối tượng và dễ dàng thiết lập và nhận nhờ các thuộc tính
  • Chúng bị loại bỏ sau khi phiên bản bị xóa, vì vậy chúng sẽ chết cùng với phiên bản mà chúng được liên kết, điều này làm cho mọi thứ rõ ràng hơn

Nhược điểm của thuộc tính thể hiện

  • Họ không cho phép theo dõi các giá trị giữa các phiên bản
  • Việc các giá trị của chúng bị mất khi xóa cũng là một bất lợi trong một số trường hợp bạn muốn lưu giữ lịch sử các giá trị chẳng hạn

Python xử lý các thuộc tính lớp và đối tượng bằng cách sử dụng Dictionary? như thế nào

Tất cả các phiên bản đều có một từ điển __dict__ mà chúng sử dụng để lưu trữ các thuộc tính và giá trị tương ứng của chúng. Hãy sử dụng ví dụ của chúng tôi

Đầu ra

{'_Person__name': 'Laura', 'class_attr': 'This is a changed class attribute'}
{'_Person__name': 'Bob'}
{'__doc__': None, 'class_attr': 'I am a class attribute', '__init__': , '__module__': '__main__', 'name': , '__weakref__': , '__dict__': }

__dict__ sẽ chỉ hiển thị các thuộc tính cá thể. Nhưng không phải class_attr là thuộc tính của lớp sao? . Ngoài ra, __dict__ trên person_2 sẽ chỉ liệt kê các thuộc tính cá thể mà nó biết cho person_2, không phải các thuộc tính từ các cá thể khác của Person. Cuối cùng, chúng ta có thể thấy rằng việc áp dụng __dict__ trên lớp Person cũng in ra một từ điển với các thuộc tính. Có, bởi vì ngay cả khi Người là một lớp, thì về mặt kỹ thuật, nó cũng là một đối tượng và có các thuộc tính có thể được liệt kê. Chúng ta có thể nhận thấy ‘class_attr’. 'Tôi là một thuộc tính lớp' là thuộc tính lớp của chúng tôi và thuộc tính tên không có giá trị vì giá trị của nó được đưa ra trong mỗi lần khởi tạo lớp

Phần kết luận

Tóm lại, chúng ta có thể nói rằng các lớp là một công cụ mạnh mẽ của OOP và chúng có thể được sử dụng theo nhiều cách, cũng như các thuộc tính của chúng. Việc chọn sử dụng các thuộc tính của lớp hoặc cá thể là tùy thuộc vào loại lớp mà chúng ta muốn tạo và chúng ta nên đảm bảo rằng mình hiểu cả hai thuộc tính này khi sử dụng chúng

Khi nào bạn nên sử dụng một thuộc tính lớp?

Thuộc tính lớp chỉ định một hoặc nhiều tên lớp cho một phần tử. Thuộc tính lớp chủ yếu được sử dụng để trỏ đến một lớp trong biểu định kiểu . Tuy nhiên, nó cũng có thể được sử dụng bởi JavaScript [thông qua HTML DOM] để thay đổi các phần tử HTML với một lớp được chỉ định.

Việc sử dụng thuộc tính lớp trong Python là gì?

Thuộc tính lớp và trường hợp trong Python . Giá trị của các thuộc tính lớp vẫn giữ nguyên cho mọi đối tượng mới. To give a basic definition of both terms, class attributes are class variables that are inherited by every object of a class. The value of class attributes remain the same for every new object.

Khi nào tôi nên sử dụng biến lớp Python?

Trong Python, chúng ta nên sử dụng đúng biến lớp vì tất cả các đối tượng đều chia sẻ cùng một bản sao . Do đó, nếu một trong các đối tượng sửa đổi giá trị của một biến lớp, thì tất cả các đối tượng bắt đầu tham chiếu đến bản sao mới. Trong ví dụ trên, tên biến thể hiện là duy nhất cho mỗi người chơi.

Lợi thế của việc làm việc với thuộc tính lớp là gì?

Ưu điểm của thuộc tính lớp. Tất cả các phiên bản của lớp kế thừa chúng từ lớp . Họ lưu trữ dữ liệu có liên quan đến tất cả các trường hợp. Ví dụ: chúng ta có thể có một thuộc tính lớp bộ đếm tăng lên mỗi khi chúng ta tạo một thể hiện mới và giảm đi mỗi khi chúng ta xóa một thể hiện.

Chủ Đề