Biến 'cls' được sử dụng trong các lớp Python là gì?


270

Tại sao clsđôi khi được sử dụng thay vì selflàm đối số trong các lớp Python?

Ví dụ:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    @classmethod
    def from_fullname(cls, fullname):
        cls.firstname, cls.lastname = fullname.split(' ', 1)

Câu trả lời:


293

Sự phân biệt giữa "self""cls"được định nghĩa trong PEP 8. Như Adrien đã nói, đây không phải là một điều bắt buộc. Đó là một phong cách mã hóa. PEP 8nói:

Đối số hàm và phương thức :

Luôn luôn sử dụng selfcho đối số đầu tiên cho các phương thức thể hiện.

Luôn luôn sử dụng clscho đối số đầu tiên cho các phương thức lớp.


56

Nó được sử dụng trong trường hợp của một phương thức lớp. Kiểm tra tài liệu tham khảo này để biết thêm chi tiết.

EDIT: Như được làm rõ bởi Adrien, đó là một quy ước. Bạn thực sự có thể sử dụng bất cứ thứ gì nhưng clsselfđược sử dụng ( PEP8 ).


52

clsngụ ý rằng phương thức đó thuộc về lớp trong khi bản thân ngụ ý rằng phương thức đó có liên quan đến thể hiện của lớp, do đó, thành viên clsđược truy cập bằng tên lớp trong đó đối tượng được truy cập bằng thể hiện của lớp ... đó là cùng một khái niệm như static membernon-static memberstrong java nếu bạn đến từ nền java.


1
Cảm ơn bạn đã tham khảo Java, bây giờ hiểu.
Edenshaw

Hơn bạn đã đề cập static membernon-static members, hiểu nó trong bối cảnh của c ++
Amit JS

18

Đây là câu hỏi rất tốt nhưng không muốn như câu hỏi. Có sự khác biệt giữa phương thức 'tự' và 'cls' được sử dụng mặc dù tương tự chúng ở cùng một nơi

def moon(self, moon_name):
    self.MName = moon_name

#but here cls method its use is different 

@classmethod
def moon(cls, moon_name):
    instance = cls()
    instance.MName = moon_name

Bây giờ bạn có thể thấy cả hai đều là hàm mặt trăng nhưng người ta có thể được sử dụng bên trong lớp trong khi mặt trăng tên hàm khác có thể được sử dụng cho bất kỳ lớp nào.

Đối với phương pháp lập trình thực tế:

Trong khi thiết kế lớp vòng tròn, chúng tôi sử dụng phương thức diện tích như cls thay vì tự vì chúng tôi không muốn giới hạn diện tích chỉ trong lớp vòng tròn cụ thể.


nếu bạn muốn thêm một cái gì đó mà các lập trình viên đang tìm kiếm, nếu đúng, sẽ chấp thuận nó.
TheExorcist

2

Thay vì chấp nhận một tham số tự, các phương thức lớp lấy tham số cls trỏ đến lớp và không phải là đối tượng đối tượng, khi mà phương thức được gọi. Vì phương thức lớp chỉ có quyền truy cập vào đối số cls này, nên nó không thể sửa đổi trạng thái thể hiện đối tượng . Điều đó sẽ yêu cầu quyền truy cập vào bản thân. Tuy nhiên, các phương thức lớp vẫn có thể sửa đổi trạng thái lớp áp dụng trên tất cả các phiên bản của lớp.

- Thủ thuật Python

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.