Trong khi tích hợp một ứng dụng Django mà tôi chưa từng sử dụng trước đây, tôi đã tìm thấy hai cách khác nhau được sử dụng để định nghĩa các hàm trong các lớp. Tác giả dường như sử dụng cả hai đều rất cố tình. Người đầu tiên là một trong Bản thân tôi sử dụng rất nhiều:Khi nào tôi nên sử dụng @classmethod và khi def method (self)?
class Dummy(object):
def some_function(self,*args,**kwargs):
do something here
self is the class instance
Một trong những khác là một trong những tôi không sử dụng, chủ yếu là bởi vì tôi không hiểu khi sử dụng nó, và để làm gì:
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
do something here
cls refers to what?
trong các tài liệu Python các classmethod
trang trí được giải thích với câu này:
một phương pháp lớp nhận lớp như là đối số đầu tiên ngầm, chỉ như một phương pháp dụ nhận được ví dụ.
Vì vậy, tôi đoán cls
đề cập đến Dummy
chính nó (số class
, không phải ví dụ). Tôi không hiểu chính xác tại sao điều này tồn tại, bởi vì tôi luôn có thể làm điều này:
type(self).do_something_with_the_class
Đây có phải là chỉ vì lợi ích của sự rõ ràng, hoặc đã làm tôi bỏ lỡ phần quan trọng nhất: những điều ma quái và hấp dẫn mà không thể thực hiện mà không có nó?
Tốt nhất: Tôi thích câu trả lời được chia thành cách thức - tại sao. Theo như tôi đã nhận nó bây giờ @classmethod cho phép truy cập vào các chức năng mà không cần một ví dụ. Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn bạn. – marue
@marue Bạn được chào đón! – Marcin
Tôi muốn nói các phương thức gọi lớp trên các phiên bản là kiểu mã hóa không tốt - không có lý do gì để làm như vậy và chỉ có thể gây nhầm lẫn. Nhưng có nó hoạt động (java cho phép cùng một điều, nhưng vấn đề một cảnh báo biên dịch khi gọi phương pháp tĩnh thông qua các trường hợp) – Voo