Tham số self thường được sử dụng trong lập trình hướng đối tượng, tham số self được thêm vào bên trong các phương thức của lớp, trong bài viết này chúng tôi sẽ giải thích cho bạn lý do tại sao nó tồn tại
Đó là một tham chiếu đến đối tượng. Lý do bạn cần sử dụng bản thân. là do Python sử dụng điều này để chỉ các thuộc tính cá thể
khóa học liên quan. Khóa học & bài tập lập trình Python
Giới thiệu
Trong lập trình hướng đối tượng, bạn có thể tạo nhiều đối tượng từ một lớp
Mỗi đối tượng có thể có các giá trị duy nhất cho các biến
obj1 = Person[]
obj2 = Person[]
obj3 = Person[]
Sau đó đặt [các] biến đối tượng
obj1.name = "Sally"
obj2.name = "Sandra"
obj3.name = "Steve"
Vì vậy, trực quan như thế này
Nếu bạn muốn truy cập các biến đối tượng bên trong một lớp thì sao?
Lớp không biết giá trị biến nào thuộc về đối tượng nào
class Person:
# Who is Sally, Sandra or Steve?
Bằng cách sử dụng biến self, nó có thể đặt hoặc lấy các biến đối tượng
Python sau đó biết nó nên truy cập các biến cho các đối tượng đó
Đoạn mã dưới đây đặt hai giá trị biến
Trong một lớp, họ có thể được truy cập bởi
class Person:3, điều này đề cập đến bản thân tôi, tôi. e. thuộc tính thể hiện của đối tượng hiện tại
# Who is Sally, Sandra or Steve?
class Person:
def meet[self]:
print["I am " + self.name]
Nếu một đối tượng gọi
class Person:4, thì chính đối tượng đó được chuyển thành đối số self as [ẩn]
# Who is Sally, Sandra or Steve?
>>> obj1.meet[]
I am Sally
>>> obj2.meet[]
I am Sandra
>>> obj3.meet[]
I am Steve
Nếu bạn là người mới bắt đầu học Python, thì tôi thực sự khuyên bạn nên đọc cuốn sách này
tự ví dụ
Nhớ lại rằng bạn có thể tạo các đối tượng từ một lớp
Với một lớp, bạn có thể tạo một hoặc nhiều đối tượng duy nhất
Một đối tượng có thể được tạo ra như thế này
cat = Animal[]
Khi bạn tạo một đối tượng từ một lớp, chính đối tượng đó được truyền dưới dạng tham số [trong hàm tạo]
Xem từ self trong hàm tạo bên dưới
Do đó, chính đối tượng được thông qua
Nếu bạn tạo hai đối tượng, cả hai sẽ được truyền dưới dạng tham số trong hàm tạo [
class Person:5]
# Who is Sally, Sandra or Steve?
obj1.name = "Sally"0
obj2.name = "Sandra"
obj3.name = "Steve"
Bởi vì bạn chuyển chính đối tượng đó làm tham số trong hàm tạo, các biến đối tượng có thể được truy cập bằng từ khóa
class Person:5
# Who is Sally, Sandra or Steve?
Nếu bạn có lớp như được định nghĩa dưới đây
obj1.name = "Sally"2
obj2.name = "Sandra"
obj3.name = "Steve"
Nó có một phương thức
class Person:7 lấy đối tượng và tên biến
# Who is Sally, Sandra or Steve?
Mỗi lần bạn gọi phương thức
class Person:7, chính đối tượng đó sẽ được chuyển
# Who is Sally, Sandra or Steve?
Từ khóa self có thể được sử dụng để đặt tên đối tượng dòng điện, bạn có thể làm điều này
obj1.name = "Sally"5
obj2.name = "Sandra"
obj3.name = "Steve"
Chúng trông giống nhau, nhưng chúng khác nhau
Phương thức
class Person:7 được gọi với một tên khác, nhưng cũng với một đối tượng khác
# Who is Sally, Sandra or Steve?
Cuộc gọi đầu tiên chuyển đối tượng cat dưới dạng tham số ẩn [tự]
obj1.name = "Sally"0
obj2.name = "Sandra"
obj3.name = "Steve"
Cuộc gọi thứ hai chuyển đối tượng dog dưới dạng tham số ẩn [bản thân]
obj1.name = "Sally"1
obj2.name = "Sandra"
obj3.name = "Steve"
Nếu bạn xuất
class Person:0 hoặc
def meet[self]:
print["I am " + self.name]
class Person:1, bạn sẽ thấy các biến đối tượng đã được thay đổi bên trong lớp
def meet[self]:
print["I am " + self.name]
Nếu bạn là người mới bắt đầu học Python, thì tôi thực sự khuyên bạn nên đọc cuốn sách này
Bạn có thể bỏ qua biến “bản thân” không?
Từ khóa self được sử dụng để truy cập các biến đối tượng. Bạn có thể bỏ qua điều này?
Câu trả lời ngắn gọn là không
Nếu bạn thử, nó sẽ báo lỗi
obj1.name = "Sally"2
obj2.name = "Sandra"
obj3.name = "Steve"
Đó là bởi vì hàm
class Person:2 không chấp nhận đối số bằng 0 nhưng chúng tôi đã cung cấp một đối số
def meet[self]:
print["I am " + self.name]
Bản thân đối tượng
class Person:3 được tự động chuyển thành đối số đầu tiên
def meet[self]:
print["I am " + self.name]
Đó là lý do tại sao self được yêu cầu làm đối số trong hàm lớp
obj1.name = "Sally"3
obj2.name = "Sandra"
obj3.name = "Steve"
Vì đối tượng được truyền dưới dạng đối số nên bạn có thể truy cập các biến đối tượng
obj1.name = "Sally"4
obj2.name = "Sandra"
obj3.name = "Steve"
python tự đối tượng
Biến self được liên kết với đối tượng hiện tại
Ví dụ dưới đây cho thấy rằng
obj1.name = "Sally"5
obj2.name = "Sandra"
obj3.name = "Steve"
Bạn có thể tạo đối tượng mới
obj1.name = "Sally"6
obj2.name = "Sandra"
obj3.name = "Steve"
Sau đó, khi gọi phương thức
class Person:4, đối tượng được truyền dưới dạng đối số ẩn
def meet[self]:
print["I am " + self.name]
obj1.name = "Sally"7
obj2.name = "Sandra"
obj3.name = "Steve"
Trên thực tế, đối tượng được truyền cả khi được tạo [đến hàm tạo] và khi gọi phương thức [setBrand]
Từ khóa self phải được bao gồm cho mọi phương thức lớp
Tại sao không tự ẩn?
Trong Python, bạn phải tự viết mỗi lần trong một lớp
Nó yêu cầu định nghĩa rõ ràng
Triết lý của Python là “Rõ ràng tốt hơn ẩn ý”
Bạn có thể đọc thêm về quyết định đó tại đây
self trong các ngôn ngữ lập trình khác
Trong các ngôn ngữ lập trình khác, bạn có một cái gì đó tương tự với một cú pháp khác
Ngôn ngữ lập trình Java đã sử dụng
class Person:5 để thay thế
def meet[self]:
print["I am " + self.name]
obj1.name = "Sally"8
obj2.name = "Sandra"
obj3.name = "Steve"
Ruby sử dụng ký hiệu
class Person:6
def meet[self]:
print["I am " + self.name]
obj1.name = "Sally"9
obj2.name = "Sandra"
obj3.name = "Steve"
Mặc dù chúng khác nhau về mặt cú pháp,
Tất cả các ngôn ngữ lập trình hướng đối tượng đều đề cập đến dữ liệu đối tượng theo cách tương tự
Đó là tất cả cho cùng một mục đích. để truy cập các biến đối tượng trong lớp
Vì vậy, bản thân của Python tương tự như
class Person:5 của Java,
def meet[self]:
print["I am " + self.name]
class Person:6 của Ruby và
def meet[self]:
print["I am " + self.name]
class Person:5 của C++
def meet[self]:
print["I am " + self.name]
các biến tương tự cho phương thức lớp và phương thức tĩnh
Bạn đã học về bản thân trước đây, đây là lớp mặc định thông thường
Bây giờ vào một cái gì đó khác nhau. phương pháp lớp
Một phương thức lớp có thể được gọi mà không cần tạo đối tượng, bạn gọi nó trực tiếp trên lớp
class Person:0
# Who is Sally, Sandra or Steve?
Nếu bạn có một phương thức lớp, bạn có thể sử dụng cls để thay thế
class Person:1
# Who is Sally, Sandra or Steve?
Ở đây cls đề cập đến các biến lớp, không phải biến đối tượng
class Person:2
# Who is Sally, Sandra or Steve?
Kết quả đầu ra này
>>> obj1.meet[]0
I am Sally
>>> obj2.meet[]
I am Sandra
>>> obj3.meet[]
I am Steve
Đối với một phương thức tĩnh, nó không bắt buộc
Đó là bởi vì phương thức tĩnh chỉ là phương thức, chúng không thể truy cập trực tiếp bất kỳ biến lớp hoặc biến đối tượng nào