Phương thức nào của một lớp được gọi để khởi tạo một đối tượng của lớp đó?

Python là ngôn ngữ lập trình hướng đối tượng, có nghĩa là nó cung cấp các tính năng hỗ trợ lập trình hướng đối tượng (OOP)

Lập trình hướng đối tượng bắt nguồn từ những năm 1960, nhưng mãi đến giữa những năm 1980, nó mới trở thành mô hình lập trình chính được sử dụng để tạo ra phần mềm mới. Nó được phát triển như một cách để xử lý quy mô và độ phức tạp ngày càng tăng nhanh chóng của các hệ thống phần mềm và giúp dễ dàng sửa đổi các hệ thống lớn và phức tạp này theo thời gian

Cho đến nay, hầu hết các chương trình chúng tôi viết đều sử dụng mô hình lập trình thủ tục. Trong lập trình thủ tục, trọng tâm là viết các hàm hoặc thủ tục hoạt động trên dữ liệu. Trong lập trình hướng đối tượng, trọng tâm là tạo ra các đối tượng chứa cả dữ liệu và chức năng cùng nhau. (Chúng tôi đã thấy các đối tượng con rùa, đối tượng chuỗi và trình tạo số ngẫu nhiên, để kể tên một vài nơi mà chúng tôi đã làm việc với các đối tượng. )

Thông thường, mỗi định nghĩa đối tượng tương ứng với một số đối tượng hoặc khái niệm trong thế giới thực và các chức năng hoạt động trên đối tượng đó tương ứng với cách các đối tượng trong thế giới thực tương tác.

15. 2. Kiểu dữ liệu phức hợp do người dùng xác định

Chúng ta đã thấy các lớp như str , int, float and Turtle. We are now ready to create our own user-defined class: the Điểm .

Xem xét khái niệm điểm toán học. Trong hai chiều, một điểm là hai số (tọa độ) được coi như một đối tượng duy nhất. Điểm thường được viết trong ngoặc đơn với dấu phẩy ngăn cách tọa độ. Ví dụ: (0, 0) đại diện cho nguồn gốc và ( . y) represents the point x units to the right and y units up from the origin.

Một số phép toán điển hình mà một người liên kết với các điểm có thể là tính khoảng cách của một điểm từ gốc tọa độ hoặc từ một điểm khác hoặc tìm trung điểm của hai điểm hoặc hỏi xem một điểm có nằm trong một hình chữ nhật hoặc hình tròn cho trước hay không. Chúng tôi sẽ sớm xem cách chúng tôi có thể tổ chức những thứ này cùng với dữ liệu

Một cách tự nhiên để biểu thị một điểm trong Python là có hai giá trị số. Sau đó, câu hỏi đặt ra là làm thế nào để nhóm hai giá trị này thành một đối tượng phức hợp. Giải pháp nhanh và bẩn là sử dụng bộ dữ liệu và đối với một số ứng dụng có thể là lựa chọn tốt

Một cách khác là định nghĩa một lớp mới. Cách tiếp cận này đòi hỏi nhiều nỗ lực hơn một chút, nhưng nó có những ưu điểm sẽ sớm xuất hiện. Chúng ta muốn mỗi điểm của chúng ta có xy .

1
2
3
4
5
6
7

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0

Định nghĩa lớp có thể xuất hiện ở bất kỳ đâu trong chương trình, nhưng chúng thường ở gần phần đầu (sau câu lệnh nhập ). Một số lập trình viên và ngôn ngữ thích đặt mỗi lớp trong một mô-đun của riêng nó — chúng tôi sẽ không làm điều đó ở đây. Các quy tắc cú pháp cho một định nghĩa lớp cũng giống như đối với các câu lệnh ghép khác. Có một tiêu đề bắt đầu bằng từ khóa, lớp , theo sau là tên của lớp và kết thúc bằng dấu hai chấm. Các mức thụt đầu dòng cho chúng tôi biết lớp kết thúc ở đâu.

Nếu dòng đầu tiên sau tiêu đề lớp là một chuỗi, nó sẽ trở thành chuỗi tài liệu của lớp và sẽ được các công cụ khác nhau nhận dạng. (Đây cũng là cách các chuỗi tài liệu hoạt động trong các hàm. )

Mỗi lớp nên có một phương thức với tên đặc biệt __init__ . Phương thức khởi tạo này được tự động gọi bất cứ khi nào một phiên bản mới của Điểm được tạo. Nó mang đến cho lập trình viên cơ hội thiết lập các thuộc tính cần thiết trong phiên bản mới bằng cách cung cấp cho chúng trạng thái/giá trị ban đầu. Tham số self (chúng ta có thể chọn bất kỳ tên nào khác, nhưng self là .

Vì vậy, hãy sử dụng lớp Điểm mới của chúng ta ngay bây giờ.

1
2
3
4

p = Point()         # Instantiate an object of type Point
q = Point()         # Make a second point

print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y

Chương trình này in

0 0 0 0

vì trong quá trình khởi tạo đối tượng, chúng ta đã tạo hai thuộc tính có tên là xy for each, and gave them both the value 0.

Điều này có vẻ quen thuộc — trước đây chúng ta đã sử dụng các lớp để tạo nhiều đối tượng

1
2
3
4

from turtle import Turtle

tess = Turtle()     # Instantiate objects of type Turtle
alex = Turtle()

Các biến pq được gán tham chiếu đến . Một hàm như Point objects. A function like Turtle hoặc Point để tạo một thể hiện đối tượng mới được gọi là .

Có thể hữu ích khi nghĩ về một lớp như một nhà máy để tạo ra các đối tượng. Bản thân lớp không phải là một thể hiện của một điểm, nhưng nó chứa bộ máy để tạo ra các thể hiện của điểm. Mỗi khi chúng tôi gọi hàm tạo, chúng tôi yêu cầu nhà máy tạo cho chúng tôi một đối tượng mới. Khi đối tượng ra khỏi dây chuyền sản xuất, phương thức khởi tạo của nó được thực thi để thiết lập đối tượng đúng với cài đặt mặc định ban đầu của nó

Quá trình kết hợp giữa “tạo cho tôi một đối tượng mới” và “đặt cài đặt của đối tượng đó về cài đặt mặc định gốc” được gọi là quá trình khởi tạo

15. 3. Thuộc tính

Giống như các đối tượng trong thế giới thực, các thể hiện của đối tượng có cả thuộc tính và phương thức

Chúng ta có thể sửa đổi các thuộc tính trong một thể hiện bằng cách sử dụng ký hiệu dấu chấm

>>> p.x = 3
>>> p.y = 4

Cả mô-đun và phiên bản đều tạo không gian tên riêng của chúng và cú pháp để truy cập tên có trong mỗi thuộc tính, được gọi là thuộc tính, là giống nhau. Trong trường hợp này, thuộc tính chúng tôi đang chọn là một mục dữ liệu từ một thể hiện

Sơ đồ trạng thái sau đây cho thấy kết quả của các nhiệm vụ này

Phương thức nào của một lớp được gọi để khởi tạo một đối tượng của lớp đó?

Biến p tham chiếu đến đối tượng Điểm , . Mỗi thuộc tính đề cập đến một số.

Chúng ta có thể truy cập giá trị của một thuộc tính bằng cùng một cú pháp

________số 8

Biểu thức p. x có nghĩa là “Đi tới đối tượng mà p đề cập đến và nhận giá trị của x”. In this case, we assign that value to a variable named x . Không có xung đột giữa biến x (trong không gian tên chung ở đây) và thuộc tính x (in the namespace belonging to the instance). The purpose of dot notation is to fully qualify which variable we are referring to unambiguously.

Chúng ta có thể sử dụng ký hiệu dấu chấm như một phần của bất kỳ biểu thức nào, vì vậy các câu sau đây là hợp lệ

1
2

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
0

Dòng đầu tiên xuất ra (x=3, y=4) . Dòng thứ hai tính giá trị 25.

15. 4. Cải thiện trình khởi tạo của chúng tôi

Để tạo một điểm tại vị trí (7, 6) hiện tại cần ba dòng mã

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
1

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
2

Chúng ta có thể làm cho hàm tạo của lớp trở nên tổng quát hơn bằng cách đặt các tham số bổ sung vào phương thức __init__ , như minh họa trong ví dụ này.

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
3

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
4

Các tham số xy ở đây đều là tùy chọn. Nếu người gọi không cung cấp đối số, họ sẽ nhận được các giá trị mặc định là 0. Đây là lớp cải tiến của chúng tôi đang hoạt động.

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
5

về mặt kỹ thuật

Nếu chúng tôi thực sự cầu kỳ, chúng tôi sẽ lập luận rằng chuỗi tài liệu của phương thức __init__ là không chính xác. __init__ không tạo đối tượng (i. e. dành bộ nhớ cho nó), — nó chỉ khởi tạo đối tượng về cài đặt mặc định gốc sau khi tạo.

Nhưng các công cụ như PyScripter hiểu rằng việc khởi tạo - tạo và khởi tạo - xảy ra cùng nhau và chúng chọn hiển thị chuỗi tài liệu của trình khởi tạo làm chú giải công cụ để hướng dẫn lập trình viên gọi hàm tạo của lớp

Vì vậy, chúng tôi đang viết chuỗi tài liệu sao cho nó có ý nghĩa nhất khi nó bật lên để trợ giúp lập trình viên đang sử dụng Điểm của chúng tôi .

Phương thức nào của một lớp được gọi để khởi tạo một đối tượng của lớp đó?

15. 5. Thêm các phương thức khác vào lớp của chúng tôi

Ưu điểm chính của việc sử dụng một lớp như Điểm thay vì một bộ đơn giản (6,< . Chúng ta có thể thêm các phương thức vào lớp 7) now becomes apparent. We can add methods to the Điểm là các phép toán hợp lý cho các điểm, nhưng có thể không phù hợp với các bộ khác như (25, 12) which might represent, say, a day and a month, e.g. Christmas day. So being able to calculate the distance from the origin is sensible for points, but not for (day, month) data. For (day, month) data, we’d like different operations, perhaps to find what day of the week it will fall on in 2020.

Việc tạo một lớp như Điểm mang lại một lượng “sức mạnh tổ chức” đặc biệt cho các chương trình và suy nghĩ của chúng tôi. Chúng ta có thể nhóm các hoạt động hợp lý lại với nhau và các loại dữ liệu mà chúng áp dụng và mỗi phiên bản của lớp có thể có trạng thái riêng.

Một phương thức hoạt động giống như một hàm nhưng nó được gọi trong một trường hợp cụ thể, e. g. tess. phải(90) . Giống như một thuộc tính dữ liệu, các phương thức được truy cập bằng ký hiệu dấu chấm.

Hãy thêm một phương thức khác, distance_from_origin , để hiểu rõ hơn cách thức hoạt động của các phương thức.

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
6

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
7

Hãy tạo một vài thể hiện điểm, xem xét các thuộc tính của chúng và gọi phương thức mới của chúng ta trên chúng. (Chúng ta phải chạy chương trình của mình trước để cung cấp lớp Điểm cho trình thông dịch. )

class Point:
    """ Point class represents and manipulates x,y coords. """

    def __init__(self):
        """ Create a new point at the origin """
        self.x = 0
        self.y = 0
8

Khi định nghĩa một phương thức, tham số đầu tiên đề cập đến thể hiện đang được thao tác. Như đã lưu ý, thông thường đặt tên cho tham số này là self .

Lưu ý rằng người gọi khoảng_cách_từ_origin không cung cấp rõ ràng đối số để khớp với chính . . . . . . . . parameter — this is done for us, behind our back.

15. 6. Thể hiện dưới dạng đối số và tham số

Chúng ta có thể truyền một đối tượng làm đối số theo cách thông thường. Chúng ta đã thấy điều này trong một số ví dụ về rùa, trong đó chúng ta đã chuyển rùa đến một hàm nào đó như draw_bar trong chương có tiêu đề Điều kiện, để .

Xin lưu ý rằng biến của chúng ta chỉ chứa tham chiếu đến một đối tượng, vì vậy việc chuyển tess vào một hàm sẽ tạo ra một bí danh. cả người gọi và chức năng được gọi hiện có một tham chiếu, nhưng chỉ có một con rùa.

Đây là một chức năng đơn giản liên quan đến các đối tượng Điểm mới của chúng tôi.

1
2

1
2
3
4
0

print_point lấy một điểm làm đối số và định dạng đầu ra theo bất kỳ cách nào chúng ta chọn. Nếu chúng ta gọi print_point(p) với điểm p như đã định nghĩa trước đó, . (3, 4).

15. 7. Chuyển đổi một thể hiện thành một chuỗi

Hầu hết các lập trình viên hướng đối tượng có thể sẽ không làm những gì chúng ta vừa làm trong print_point . Khi chúng ta làm việc với các lớp và đối tượng, một giải pháp thay thế ưu tiên là thêm một phương thức mới vào lớp. Và chúng tôi không thích các phương thức hộp trò chuyện gọi in . Cách tiếp cận tốt hơn là có một phương thức sao cho mọi trường hợp có thể tạo ra một chuỗi biểu diễn của chính nó. Ban đầu, hãy gọi nó là to_string .

1
2
3
4
1

1
2
3
4
2

Bây giờ chúng ta có thể nói

1
2
3
4
3

Nhưng chẳng phải chúng ta đã có một trình chuyển đổi kiểu str có thể biến đối tượng của chúng ta thành một chuỗi sao? . Và in không tự động sử dụng điều này khi in mọi thứ? . Nhưng những cơ chế tự động này vẫn chưa thực hiện chính xác những gì chúng ta muốn.

1
2
3
4
4

Python có một thủ thuật thông minh để khắc phục điều này. Nếu chúng ta gọi phương thức mới __str__ thay vì to_string , trình thông dịch Python . Hãy làm lại điều này một lần nữa, bây giờ. Point to a string. Let’s re-do this again, now:

1
2
3
4
1

1
2
3
4
6

và bây giờ mọi thứ trông thật tuyệt

1
2
3
4
7

15. 8. Các trường hợp dưới dạng giá trị trả về

Các hàm và phương thức có thể trả về các phiên bản. Ví dụ: cho hai đối tượng Điểm , hãy tìm trung điểm của chúng. Đầu tiên chúng ta sẽ viết cái này như một hàm thông thường.

1
2
3
4
1

1
2
3
4
9

Hàm tạo và trả về một đối tượng Điểm mới.

p = Point()         # Instantiate an object of type Point
q = Point()         # Make a second point

print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
0

Bây giờ chúng ta hãy làm điều này như một phương pháp thay vì. Giả sử chúng ta có một đối tượng điểm và muốn tìm điểm giữa nằm giữa nó và một số điểm mục tiêu khác

p = Point()         # Instantiate an object of type Point
q = Point()         # Make a second point

print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
1

p = Point()         # Instantiate an object of type Point
q = Point()         # Make a second point

print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
2

Phương pháp này giống hệt với chức năng, ngoài một số đổi tên. Cách sử dụng của nó có thể như thế này

p = Point()         # Instantiate an object of type Point
q = Point()         # Make a second point

print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
3

Trong khi ví dụ này gán mỗi điểm cho một biến, điều này không cần phải làm. Giống như các lời gọi hàm có thể kết hợp được, các lời gọi phương thức và khởi tạo đối tượng cũng có thể kết hợp được, dẫn đến giải pháp thay thế này không sử dụng biến

p = Point()         # Instantiate an object of type Point
q = Point()         # Make a second point

print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
4

15. 9. Một sự thay đổi quan điểm

Cú pháp ban đầu của lệnh gọi hàm, print_time(current_time) , gợi ý rằng hàm là tác nhân tích cực. Nó nói đại loại như, “Này, print_time. Đây là một đối tượng để bạn in. ”

Trong lập trình hướng đối tượng, đối tượng được coi là tác nhân tích cực. Một lời gọi như current_time. print_time() nói “Xin chào current_time. Hãy in cho mình. ”

Trong phần giới thiệu ban đầu về rùa, chúng tôi đã sử dụng kiểu hướng đối tượng, do đó chúng tôi đã nói tess. forward(100) , yêu cầu con rùa tự di chuyển về phía trước theo số bước đã cho.

Sự thay đổi quan điểm này có thể lịch sự hơn, nhưng ban đầu có thể không rõ ràng là nó hữu ích. Nhưng đôi khi việc chuyển trách nhiệm từ các chức năng sang các đối tượng giúp viết các chức năng linh hoạt hơn và giúp duy trì và sử dụng lại mã dễ dàng hơn

Ưu điểm quan trọng nhất của phong cách hướng đối tượng là nó phù hợp với việc phân chia tư duy và trải nghiệm thực tế của chúng ta một cách chính xác hơn. Trong thực tế, phương pháp nấu của chúng tôi là một phần của lò vi sóng — chúng tôi không có nấu function sitting in the corner of the kitchen, into which we pass the microwave! Similarly, we use the cellphone’s own methods to send an sms, or to change its state to silent. The functionality of real-world objects tends to be tightly bound up inside the objects themselves. OOP allows us to accurately mirror this when we organize our programs.

15. 10. Các đối tượng có thể có trạng thái

Các đối tượng hữu ích nhất khi chúng ta cũng cần giữ một số trạng thái được cập nhật theo thời gian. Hãy xem xét một đối tượng con rùa. Trạng thái của nó bao gồm những thứ như vị trí, tiêu đề, màu sắc và hình dạng của nó. Một phương thức như left(90) cập nhật tiêu đề của con rùa, chuyển tiếp thay đổi .

Đối với đối tượng tài khoản ngân hàng, thành phần chính của trạng thái sẽ là số dư hiện tại và có thể là nhật ký của tất cả các giao dịch. Các phương thức sẽ cho phép chúng tôi truy vấn số dư hiện tại, gửi tiền mới hoặc thanh toán. Thực hiện thanh toán sẽ bao gồm số tiền và mô tả để có thể thêm thông tin này vào nhật ký giao dịch. Chúng tôi cũng muốn có một phương pháp để hiển thị nhật ký giao dịch

15. 11. Bảng chú giải

thuộc tínhMột trong những mục dữ liệu được đặt tên tạo nên một thể hiện. loại hợp chất do người dùng định nghĩa classA. Một lớp cũng có thể được coi là khuôn mẫu cho các đối tượng là thể hiện của nó. (iPhone là một lớp. Đến tháng 12 năm 2010, ước tính có 50 triệu phiên bản đã được bán. )constructor Mỗi lớp có một "nhà máy", được gọi bằng tên giống như lớp, để tạo các thể hiện mới. Nếu lớp có một phương thức khởi tạo, thì phương thức này được sử dụng để lấy các thuộc tính (i. e. trạng thái) của đối tượng mới được thiết lập đúng cách. phương thức khởi tạo Một phương thức đặc biệt trong Python (được gọi là __init__ ) được gọi tự động để đặt các thuộc tính của đối tượng mới được tạo về trạng thái ban đầu (mặc định của nhà sản xuất). thể hiệnMột đối tượng có kiểu thuộc lớp nào đó. Ví dụ và đối tượng được sử dụng thay thế cho nhau. instantiateĐể tạo một thể hiện của một lớp và để chạy trình khởi tạo của nó. methodMột hàm được định nghĩa bên trong một định nghĩa lớp và được gọi trên các thể hiện của lớp đó. đối tượngMột kiểu dữ liệu phức hợp thường được sử dụng để mô hình hóa một sự vật hoặc khái niệm trong thế giới thực. Nó kết hợp dữ liệu và các hoạt động có liên quan đến loại dữ liệu đó. Ví dụ và đối tượng được sử dụng thay thế cho nhau. lập trình hướng đối tượng phong cách lập trình mạnh mẽ trong đó dữ liệu và các hoạt động thao tác với nó được tổ chức thành các đối tượng. ngôn ngữ hướng đối tượngMột ngôn ngữ cung cấp các tính năng, chẳng hạn như các lớp do người dùng định nghĩa và tính kế thừa, hỗ trợ lập trình hướng đối tượng.

15. 12. bài tập

  1. Viết lại hàm khoảng cách từ chương có tiêu đề Các hàm hiệu quả sao cho mất hai Điểm . . . . . . . . . . . . . . . s as parameters instead of four numbers.

  2. Thêm một phương thức reflect_x vào Điểm sẽ trả về một . Ví dụ: Point, one which is the reflection of the point about the x-axis. For example, Điểm(3, 5). phản_x() là (3, -5)

  3. Thêm phương thức slope_from_origin trả về độ dốc của đường nối từ gốc đến điểm. Ví dụ:

    p = Point()         # Instantiate an object of type Point
    q = Point()         # Make a second point
    
    print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
    
    5

    Những trường hợp nào sẽ khiến phương pháp này thất bại?

  4. Phương trình của một đường thẳng là “y = ax + b”, (hoặc có lẽ là “y = mx + c”). Các hệ số a và b mô tả hoàn toàn đường. Viết một phương thức trong lớp Điểm để nếu một thể hiện điểm được cho một điểm khác, nó sẽ tính phương trình của đường thẳng nối hai điểm. Nó phải trả về hai hệ số dưới dạng một bộ gồm hai giá trị. Ví dụ:

    p = Point()         # Instantiate an object of type Point
    q = Point()         # Make a second point
    
    print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
    
    6

    Điều này cho chúng ta biết rằng phương trình của đường thẳng nối hai điểm là “y = 2x + 3”. Khi nào phương pháp này sẽ thất bại?

  5. Cho 4 điểm thuộc một đường tròn, tìm trung điểm của đường tròn. Khi nào thì chức năng này bị lỗi?

    Gợi ý. Bạn phải biết cách giải bài toán hình học trước khi nghĩ đến việc học lập trình. Bạn không thể lập trình giải pháp cho một vấn đề nếu bạn không hiểu bạn muốn máy tính làm gì

  6. Tạo một lớp mới, SMS_store. Lớp sẽ khởi tạo các đối tượng SMS_store, tương tự như hộp thư đến hoặc hộp thư đi trên điện thoại di động

    p = Point()         # Instantiate an object of type Point
    q = Point()         # Make a second point
    
    print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
    
    7

    Cửa hàng này có thể chứa nhiều tin nhắn SMS (tôi. e. trạng thái bên trong của nó sẽ chỉ là một danh sách các tin nhắn). Mỗi tin nhắn sẽ được biểu diễn dưới dạng một Tuple

    p = Point()         # Instantiate an object of type Point
    q = Point()         # Make a second point
    
    print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
    
    8

    Đối tượng hộp thư đến sẽ cung cấp các phương thức này

    p = Point()         # Instantiate an object of type Point
    q = Point()         # Make a second point
    
    print(p.x, p.y, q.x, q.y)  # Each point object has its own x and y
    
    9

    Viết lớp, tạo đối tượng lưu trữ thông báo, viết bài kiểm tra cho các phương thức này và triển khai các phương thức

    Phương thức nào được sử dụng để khởi tạo đối tượng?

    Constructor là một phương thức đặc biệt có cùng tên với lớp và được dùng để khởi tạo các thuộc tính của một đối tượng mới.

    Cái nào sau đây được sử dụng để khởi tạo các thuộc tính đối tượng của một lớp?

    Trình tạo khởi tạo thuộc tính trong đối tượng mới tạo. Họ có cùng tên với lớp.