Python - Class Attributes

Các thuộc tính hoặc biến được định nghĩa bên trong một lớp được gọi là Attributes . Một thuộc tính cung cấp thông tin về loại dữ liệu mà một lớp chứa. Có hai loại thuộc tính trong Python, đó là instance attribute class attribute .

Thuộc tính thể hiện (instance attribute) được định nghĩa trong hàm khởi tạo (constructor) của một lớp Python và là duy nhất cho mỗi thể hiện của lớp đó. Còn thuộc tính lớp (class attribute) được khai báo và khởi tạo bên ngoài hàm khởi tạo của lớp.

Class Attributes (Variables)

Thuộc tính lớp là những biến thuộc về một lớp và giá trị của chúng được chia sẻ giữa tất cả các thể hiện của lớp đó. Một thuộc tính lớp giữ nguyên giá trị cho mọi thể hiện của lớp.

Thuộc tính lớp được định nghĩa trong lớp nhưng bên ngoài bất kỳ phương thức nào. Chúng không thể được khởi tạo bên trong __init__() hàm khởi tạo. Chúng có thể được truy cập bằng tên của lớp bên cạnh đối tượng. Nói cách khác, một thuộc tính lớp có sẵn cho lớp cũng như đối tượng của nó.

Accessing Class Attributes

Tên đối tượng theo sau bởi ký hiệu chấm (.) được sử dụng để truy cập các thuộc tính của lớp.

Example

Ví dụ dưới đây minh họa cách truy cập các thuộc tính của một lớp trong Python.

class Employee:
   name = "Bhavesh Aggarwal"
   age = "30"

# instance of the class
emp = Employee()
# accessing class attributes
print("Name of the Employee:", emp.name)
print("Age of the Employee:", emp.age)

Output

Name of the Employee: Bhavesh Aggarwal
Age of the Employee: 30

Modifying Class Attributes

Để sửa đổi giá trị của một thuộc tính lớp, chúng ta chỉ cần gán một giá trị mới cho nó bằng cách sử dụng tên lớp theo sau là dấu chấm và tên thuộc tính.

Example

Trong ví dụ dưới đây, chúng ta đang khởi tạo một biến lớp có tên empCount trong lớp Employee. Đối với mỗi đối tượng được khai báo, phương thức __init__() sẽ được gọi tự động. Phương thức này khởi tạo các biến thể hiện cũng như tăng empCount lên 1.

class Employee:
   # class attribute    
   empCount = 0
   def __init__(self, name, age):
      self.__name = name
      self.__age = age
      # modifying class attribute
      Employee.empCount += 1
      print ("Name:", self.__name, ", Age: ", self.__age)
      # accessing class attribute
      print ("Employee Count:", Employee.empCount)

e1 = Employee("Bhavana", 24)
print()
e2 = Employee("Rajesh", 26)

Output

Chúng tôi đã khai báo hai đối tượng. Mỗi lần, empCount sẽ tăng thêm 1.

Name: Bhavana , Age:  24
Employee Count: 1

Name: Rajesh , Age:  26
Employee Count: 2

Significance of Class Attributes

Các thuộc tính lớp là quan trọng vì những lý do sau đây −

  • They are used to define those properties of a class that should have the same value for every object of that class.
  • Class attributes can be used to set default values for objects.
  • This is also useful in creating singletons. They are objects that are instantiated only once and used in different parts of the code.

Built-In Class Attributes

Mỗi lớp Python giữ lại các thuộc tính tích hợp sẵn sau đây và chúng có thể được truy cập bằng cách sử dụng toán tử chấm như bất kỳ thuộc tính nào khác −

  • __dict__ − Từ điển chứa không gian tên của lớp.

  • __doc__ − Chuỗi tài liệu lớp hoặc không có, nếu không được định nghĩa.

  • __name__ − Tên lớp.

  • __module__ − Tên mô-đun trong đó lớp được định nghĩa. Thuộc tính này là "__main__" trong chế độ tương tác.

  • __bases__ − Một tuple có thể rỗng chứa các lớp cơ sở, theo thứ tự xuất hiện của chúng trong danh sách lớp cơ sở.

Access Built-In Class Attributes

Để truy cập các thuộc tính lớp tích hợp sẵn trong Python, chúng ta sử dụng tên lớp theo sau là dấu chấm (.) và sau đó là tên thuộc tính.

Example

Đối với lớp Employee, chúng ta đang cố gắng truy cập tất cả các thuộc tính lớp tích hợp sẵn.

class Employee:
   def __init__(self, name="Bhavana", age=24):
      self.name = name
      self.age = age
   def displayEmployee(self):
      print ("Name : ", self.name, ", age: ", self.age)

print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__ )

Output

Nó sẽ tạo ra đầu ra sau đây −

Employee.__doc__: None
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {'__module__': '__main__', '__init__': <function Employee.__init__ at 0x0000022F866B8B80>, 'displayEmployee': <function Employee.displayEmployee at 0x0000022F866B9760>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__weakref__': <attribute '__weakref__' of 'Employee' objects>, '__doc__': None}

Instance Attributes

Như đã đề cập trước đó, một thuộc tính thể hiện trong Python là một biến cụ thể cho một đối tượng cá nhân của một lớp. Nó được định nghĩa bên trong phương thức __init__() .

Tham số đầu tiên của phương thức này là self và sử dụng tham số này để xác định các thuộc tính của thể hiện.

Example

Trong đoạn mã sau, chúng tôi đang minh họa cách hoạt động của các thuộc tính thể hiện.

class Student:
   def __init__(self, name, grade):
      self.__name = name
      self.__grade = grade
      print ("Name:", self.__name, ", Grade:", self.__grade)

# Creating instances 
student1 = Student("Ram", "B")
student2 = Student("Shyam", "C")

Output

Khi chạy đoạn mã trên, nó sẽ tạo ra đầu ra sau đây −

Name: Ram , Grade: B
Name: Shyam , Grade: C

Instance Attributes Vs Class Attributes

Bảng dưới đây cho thấy sự khác biệt giữa thuộc tính thể hiện (instance attributes) và thuộc tính lớp (class attributes) −

SNo. Instance Attribute Class Attribute
1 It is defined directly inside the __init__() function. It is defined inside the class but outside the __init__() function.
2 Instance attribute is accessed using the object name followed by dot notation. Class attributes can be accessed by both class name and object name.
3 The value of this attribute cannot be shared among other objects. Its value is shared among other objects of the class.
4 Changes made to the instance attribute affect only the object within which it is defined. Changes made to the class attribute affect all the objects of the given class.