Trong lập trình hướng đối tượng, khi chúng ta thiết kế một lớp, chúng ta sử dụng biến đối tượng và biến lớp.
Trong Class, các thuộc tính có thể được định nghĩa thành hai phần
- Biến thể hiện. Nếu giá trị của một biến thay đổi từ đối tượng này sang đối tượng khác, thì các biến đó được gọi là biến thể hiện
- Biến lớp. Biến lớp là một biến được khai báo bên trong lớp, nhưng bên ngoài bất kỳ phương thức thể hiện nào hoặc phương thức
Emma 10 ABC School Jessa 20 ABC School
9
Sau khi đọc bài viết này, bạn sẽ học được
- Cách tạo và truy cập các biến lớp
- Sửa đổi giá trị của một biến lớp
- Biến thể hiện so với. biến lớp
- Hành vi của một biến lớp trong kế thừa
Mục lục
Biến lớp trong Python là gì?
Nếu giá trị của một biến không thay đổi từ đối tượng này sang đối tượng khác, thì các loại biến như vậy được gọi là biến lớp hoặc biến tĩnh
Các biến lớp được chia sẻ bởi tất cả các phiên bản của một lớp. Không giống như biến thể hiện, giá trị của biến lớp không thay đổi từ đối tượng này sang đối tượng khác,
Trong Python, các biến Lớp được khai báo khi một lớp đang được xây dựng. Chúng không được định nghĩa bên trong bất kỳ phương thức nào của một lớp vì điều này chỉ có một bản sao của biến tĩnh sẽ được tạo và chia sẻ giữa tất cả các đối tượng của lớp
Ví dụ, trong lớp Sinh viên, chúng ta có thể có các biến thể hiện khác nhau như tên và số điểm danh vì tên và số điểm danh của mỗi sinh viên là khác nhau
Tuy nhiên, nếu chúng ta muốn đưa tên trường vào lớp học sinh, chúng ta phải sử dụng biến lớp thay vì biến thể hiện vì tên trường giống nhau đối với tất cả học sinh. Vì vậy, thay vì duy trì bản sao riêng biệt trong từng đối tượng, chúng ta có thể tạo một biến lớp chứa tên trường để tất cả học sinh [đối tượng] có thể chia sẻ nó
Chúng ta có thể thêm bất kỳ số lượng biến lớp nào trong một lớp
Tạo biến lớp
Một biến lớp được khai báo bên trong lớp, nhưng bên ngoài bất kỳ phương thức thể hiện nào hoặc phương thức
Emma 10 ABC School Jessa 20 ABC School9
Theo quy ước, thông thường nó được đặt ngay bên dưới tiêu đề lớp và trước phương thức khởi tạo và các phương thức khác
Ví dụ
class Student:
# Class variable
school_name = 'ABC School '
def __init__[self, name, roll_no]:
self.name = name
self.roll_no = roll_no
# create first object
s1 = Student['Emma', 10]
print[s1.name, s1.roll_no, Student.school_name]
# access class variable
# create second object
s2 = Student['Jessa', 20]
# access class variable
print[s2.name, s2.roll_no, Student.school_name]
đầu ra
Emma 10 ABC School Jessa 20 ABC School
Trong ví dụ trên, chúng ta đã tạo biến lớp
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
1 và truy cập nó bằng đối tượng và tên lớpGhi chú. Giống như các biến thông thường, các biến lớp có thể lưu trữ dữ liệu thuộc bất kỳ loại nào. Chúng ta có thể sử dụng danh sách Python, bộ dữ liệu Python và từ điển Python làm biến lớp
Truy cập các biến lớp
Chúng ta có thể truy cập các biến tĩnh theo tên lớp hoặc theo tham chiếu đối tượng, nhưng nên sử dụng tên lớp
Trong Python, chúng ta có thể truy cập biến lớp ở những nơi sau
- Truy cập bên trong hàm tạo bằng cách sử dụng tham số
2 hoặc tên lớpclass Student: # Class variable school_name = 'ABC School ' # constructor def __init__[self, name]: self.name = name # access class variable inside constructor using self print[self.school_name] # access using class name print[Student.school_name] # create Object s1 = Student['Emma']
- Truy cập biến lớp bên trong phương thức thể hiện bằng cách sử dụng một trong hai tên lớp
- Truy cập từ bên ngoài lớp bằng cách sử dụng tham chiếu đối tượng hoặc tên lớp
ví dụ 1. Biến lớp truy cập trong hàm tạo
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
đầu ra
ABC School ABC School
ví dụ 2. Truy cập biến lớp trong phương thức Instance và lớp bên ngoài
________số 8_______đầu ra
Inside instance method Emma 10 ABC School ABC School Outside class ABC School ABC School
Trong ví dụ này, chúng tôi đã truy cập biến lớp
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
1 bằng cách sử dụng tên lớp và từ khóa class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
2 bên trong một phương thứcSửa đổi biến lớp
Nói chung, chúng tôi gán giá trị cho một biến lớp bên trong khai báo lớp. Tuy nhiên, chúng ta có thể thay đổi giá trị của biến lớp dù trong lớp hay ngoài lớp
Ghi chú. Chúng ta chỉ nên thay đổi giá trị của biến lớp bằng tên lớp
Ví dụ
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name, roll_no]:
self.name = name
self.roll_no = roll_no
# Instance method
def show[self]:
print[self.name, self.roll_no, Student.school_name]
# create Object
s1 = Student['Emma', 10]
print['Before']
s1.show[]
# Modify class variable
Student.school_name = 'XYZ School'
print['After']
s1.show[]
đầu ra
Before Emma 10 ABC School After Emma 10 XYZ School
Ghi chú
Cách tốt nhất là sử dụng tên lớp để thay đổi giá trị của biến lớp. Bởi vì nếu chúng ta cố gắng thay đổi giá trị của biến lớp bằng cách sử dụng một đối tượng, thì một biến thể hiện mới sẽ được tạo cho đối tượng cụ thể đó, biến này sẽ che khuất các biến lớp
Ví dụ
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name, roll_no]:
self.name = name
self.roll_no = roll_no
# create Objects
s1 = Student['Emma', 10]
s2 = Student['Jessa', 20]
print['Before']
print[s1.name, s1.roll_no, s1.school_name]
print[s2.name, s2.roll_no, s2.school_name]
# Modify class variable using object reference
s1.school_name = 'PQR School'
print['After']
print[s1.name, s1.roll_no, s1.school_name]
print[s2.name, s2.roll_no, s2.school_name]
đầu ra
Before Emma 10 ABC School Jessa 20 ABC School After Emma 10 PQR School Jessa 20 ABC School
Một biến thể hiện mới được tạo cho đối tượng s1 và biến này che khuất các biến lớp. Vì vậy, hãy luôn sử dụng tên lớp để sửa đổi biến lớp
Biến lớp so với biến thể hiện
Bảng sau đây cho thấy sự khác biệt giữa biến thể hiện và biến lớp
Trong Python, các thuộc tính có thể được định nghĩa thành hai phần
- Biến thể hiện. Giá trị của biến thể hiện thay đổi từ đối tượng này sang đối tượng khác. Các biến thể hiện không được chia sẻ bởi các đối tượng. Mỗi đối tượng có bản sao riêng của thuộc tính thể hiện
- Biến lớp. Biến lớp là một biến được khai báo bên trong lớp, nhưng bên ngoài bất kỳ phương thức thể hiện nào hoặc phương thức
Emma 10 ABC School Jessa 20 ABC School
9. Các biến lớp được chia sẻ bởi tất cả các phiên bản của một lớp
Đọc thêm. Biến thể hiện trong Python với các ví dụ
Instance VariableClass BiếnInstance không được chia sẻ bởi các đối tượng. Mỗi đối tượng có bản sao riêng của thuộc tính thể hiệnCác biến lớp được chia sẻ bởi tất cả các thể hiệnCác biến thể hiện được khai báo bên trong hàm tạo i. e. , phương pháp
Emma 10 ABC School Jessa 20 ABC School9. Các biến lớp được khai báo bên trong định nghĩa lớp nhưng bên ngoài bất kỳ phương thức thể hiện và hàm tạo nào. Nó được tạo khi một thể hiện của lớp được tạo. Nó được tạo khi chương trình bắt đầu thực thi. Những thay đổi được thực hiện đối với các biến này thông qua một đối tượng sẽ không phản ánh trong một đối tượng khác. Những thay đổi được thực hiện trong biến lớp sẽ phản ánh trong tất cả các đối tượng. Biến lớp so với. Biến thể hiện
Ví dụ
Hãy xem ví dụ để tạo một biến lớp và biến thể hiện
Emma 10 ABC School Jessa 20 ABC School0
đầu ra
Emma 10 ABC School Jessa 20 ABC School1
Biến lớp trong kế thừa
Như bạn đã biết, chỉ một bản sao của biến lớp sẽ được tạo và chia sẻ giữa tất cả các đối tượng của lớp đó
Khi chúng ta sử dụng tính kế thừa, tất cả các biến và phương thức của lớp cơ sở đều có sẵn cho lớp con. Trong những trường hợp như vậy, chúng ta cũng có thể thay đổi giá trị biến lớp của lớp cha trong lớp con
Chúng ta có thể sử dụng tên lớp cha hoặc tên lớp con để thay đổi giá trị của biến lớp cha trong lớp con
Ví dụ
Emma 10 ABC School Jessa 20 ABC School2
đầu ra
Emma 10 ABC School Jessa 20 ABC School3
Điều gì sẽ xảy ra nếu cả lớp con và lớp cha có cùng tên biến lớp. Trong trường hợp này, lớp con sẽ không kế thừa biến lớp của lớp cơ sở. Vì vậy nên tạo một biến lớp riêng cho lớp con thay vì kế thừa biến lớp cơ sở
Ví dụ
Emma 10 ABC School Jessa 20 ABC School4
đầu ra
Emma 10 ABC School Jessa 20 ABC School5
Sử dụng sai các biến lớp
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 có chung 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
Ví dụ,
Ví dụ
Emma 10 ABC School Jessa 20 ABC School6
đầu ra
Emma 10 ABC School Jessa 20 ABC School7
Trong ví dụ trên, biến thể hiện
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
7 là duy nhất cho mỗi người chơi. Biến lớp class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
8 và class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
9 có thể được truy cập và sửa đổi bởi bất kỳ đối tượng nàoBởi vì cả hai đối tượng đã sửa đổi biến lớp, nên một biến thể hiện mới được tạo cho đối tượng cụ thể đó có cùng tên với biến lớp, biến này che khuất các biến lớp
Trong trường hợp của chúng tôi, đối với đối tượng
ABC School ABC School0 biến đối tượng mới
ABC School ABC School1 được tạo và đối với đối tượng
ABC School ABC School2 biến đối tượng mới
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
9 được tạoVì vậy, khi bạn cố gắng truy cập biến lớp bằng cách sử dụng đối tượng
ABC School ABC School0 hoặc
ABC School ABC School2, nó sẽ không trả về giá trị thực của biến lớp
Để tránh điều này, hãy luôn sửa đổi giá trị biến lớp bằng cách sử dụng tên lớp để tất cả các đối tượng nhận được giá trị cập nhật. Như thế này