Bạn có nên sử dụng self
khi tham khảo hàm thành viên trong Python [trong cùng một mô -đun] không?
Tổng quát hơn, tôi đã tự hỏi khi nó được yêu cầu sử dụng self
, không chỉ cho các phương thức mà còn cho các biến.
Agf
165K41 Huy hiệu vàng282 Huy hiệu bạc234 Huy hiệu Đồng41 gold badges282 silver badges234 bronze badges
Hỏi ngày 11 tháng 10 năm 2011 lúc 5:59Oct 11, 2011 at 5:59
Templardark Dark TemplarDark Templar
1.0993 huy hiệu vàng11 Huy hiệu bạc18 Huy hiệu đồng3 gold badges11 silver badges18 bronze badges
0
Thêm một câu trả lời vì Oskarbi không rõ ràng.
Bạn sử dụng self
khi:
- Xác định một phương thức thể hiện. Nó được truyền tự động dưới dạng tham số đầu tiên khi bạn gọi một phương thức trên một thể hiện và đó là trường hợp mà phương thức được gọi.
- Tham khảo một thuộc tính lớp hoặc phiên bản từ bên trong một phương thức thể hiện. Sử dụng nó khi bạn muốn gọi một phương thức hoặc truy cập một tên [biến] trên thể hiện phương thức được gọi, từ bên trong phương thức đó.
Bạn không sử dụng self
khi
- Bạn gọi một phương thức thể hiện bình thường. Sử dụng ví dụ của Oskarbi, nếu bạn làm
instance = MyClass[]
, bạn sẽ gọiMyClass.my_method
làinstance.my_method[some_var]
không phải làinstance.my_method[self, some_var]
. - Bạn tham chiếu một thuộc tính lớp từ bên ngoài một phương thức thể hiện nhưng bên trong định nghĩa lớp.
- Bạn đang ở trong một staticmethod.
Đây không phải là những ví dụ khi không sử dụng bản thân. Các DOS là khi bạn nên sử dụng nó.
Chris Frisina
18.7K22 Huy hiệu vàng81 Huy hiệu bạc164 Huy hiệu đồng22 gold badges81 silver badges164 bronze badges
Đã trả lời ngày 11 tháng 10 năm 2011 lúc 6:51Oct 11, 2011 at 6:51
0
Sử dụng self
để chỉ các biến và phương thức thể hiện từ các phương thức thể hiện khác. Cũng đặt self
làm tham số đầu tiên trong định nghĩa của các phương thức thể hiện.
Một ví dụ:
class MyClass[object]:
my_var = None
def my_method[self, my_var]:
self.my_var = my_var
self.my_other_method[]
def my_other_method[self]:
# do something...
người đàn ông thiếc
157K41 Huy hiệu vàng210 Huy hiệu bạc298 Huy hiệu Đồng41 gold badges210 silver badges298 bronze badges
Đã trả lời ngày 11 tháng 10 năm 2011 lúc 6:09Oct 11, 2011 at 6:09
OskarbioskarbiOskarbi
3091 Huy hiệu bạc8 Huy hiệu đồng1 silver badge8 bronze badges
4
Không có gì 'đặc biệt' về tên
self
. Đó là tên được ưu tiên bởi quy ước của Pythonistas, để chỉ ra những gì tham số đó dự kiến sẽ chứa.nothing 'special' about the nameself
. It is the name preferred by convention by Pythonistas, to indicate what that parameter is expected to contain.Thời gian chạy Python sẽ vượt qua giá trị 'tự' khi bạn gọi một phương thức thể hiện trên một thể hiện, cho dù bạn có cố tình cung cấp cho nó hay không. Điều này thường sẽ dẫn đến một lỗi được chẩn đoán/hiểu dễ dàng [vì hàm sẽ được gọi với số lượng tham số sai], nhưng việc sử dụng
self
2 có thể dẫn đến các lỗi loại kỳ lạ hơn.Tham số được truyền ngầm khi bạn gọi một phương thức thể hiện trên một thể hiện. Nó chứa trường hợp mà bạn gọi phương thức. Vì vậy, bạn không đề cập đến
self
trong cuộc gọi chức năng bởi vì [a] như đã lưu ý ở trên, điều đó sẽ không có ý nghĩa gì [nói chung, không có phạm viself
, vàself
không phải là từ khóa hoặc tên đặc biệt hoặc bất cứ điều gì ]; [b] Bạn đã chỉ ra trường hợp sử dụng [bằng cách viếtself
6].Tất nhiên, bạn có thể gọi rõ ràng một phương thức thể hiện bằng cách truy cập nó từ lớp. Trong trường hợp này, bạn sẽ cần chuyển thể hiện rõ ràng là tham số đầu tiên. Bạn nói chung không muốn làm điều này. Và bạn đặc biệt không muốn viết mã xem xét khả năng tham số đầu tiên là một thứ khác được truyền rõ ràng theo cách này. Điều này giống như kiểm tra
self
7 trong C ++: bạn không làm điều đó, bởi vì nếu nó có thể có nghĩa là bất cứ điều gì, thì mã gọi là sai, về mặt đạo đức nếu không phải là hợp pháp. [Ít nhất là trong Python bạn sẽ không gặp vấn đề với hành vi không xác định, nhưng nó vẫn sai về mặt đạo đức.]especially don't want to write code that considers the possibility that the first parameter is something else that's been explicitly passed in this way. This is akin to checkingself
7 in C++: you don't do it, because if it could possibly mean anything, then the calling code is wrong, morally if not legally. [At least in Python you won't have problems with undefined behaviour, but it's still morally wrong.]Trong phương thức thể hiện, vì
self
là một tham số đã được gán phiên bản làm giá trị, bạn có thể viếtself
9 để truy cập các thuộc tính của thể hiện. Không giống như trong một số ngôn ngữ kiểu 'Insplict ____20' khác, các tên thuộc tính không ngầm định "trong phạm vi".not implicitly "in scope".Không có trường hợp sử dụng nào khác cho
self
, vì một lần nữa nó không phải là một cái tên đặc biệt và đó là một mục đích cụ thể mà quy ước đặt tên địa chỉ. Nếu bạn cần truy cập 'biến' [thực sự là một thuộc tính] từ một mô -đun khác, bạn sẽ sử dụng tên mô -đun. Nếu bạn muốn truy cập một từ mô -đun hiện tại, không cần tiền tố hoặc thực sự có thể cho vấn đề đó. [Chà, bạn có thể tìm kiếm nó một cách rõ ràng trongself
2 được trả lại bởiself
3, nhưng xin đừng làm điều đó.]could explicitly look it up in theself
2 returned byself
3, but please don't do that.]
Đã trả lời ngày 11 tháng 10 năm 2011 lúc 9:52Oct 11, 2011 at 9:52
Karl Knechtelkarl KnechtelKarl Knechtel
59.4K10 Huy hiệu vàng86 Huy hiệu bạc132 Huy hiệu đồng10 gold badges86 silver badges132 bronze badges
0
Ví dụ, biến và đối với các phương thức, bắt buộc phải sử dụng bản thân bất cứ lúc nào.
Đã trả lời ngày 11 tháng 10 năm 2011 lúc 6:04Oct 11, 2011 at 6:04
lc2817lc2817lc2817
3.70216 huy hiệu bạc38 Huy hiệu đồng16 silver badges38 bronze badges
5