ตัวแปร 'cls' ใช้สำหรับอะไรในคลาส Python


270

ทำไมclsบางครั้งใช้แทนselfอาร์กิวเมนต์ในคลาส Python

ตัวอย่างเช่น:

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)

คำตอบ:


293

ความแตกต่างระหว่าง"self"และถูกกำหนดไว้ใน"cls" PEP 8ดังที่เอเดรียนกล่าวว่านี่ไม่ใช่ข้อบังคับ มันเป็นรูปแบบการเข้ารหัส PEP 8พูดว่า:

อาร์กิวเมนต์ของฟังก์ชันและเมธอด :

ใช้selfสำหรับอาร์กิวเมนต์แรกกับวิธีการเสมอ

ใช้clsสำหรับอาร์กิวเมนต์แรกกับวิธีการคลาสเสมอ


56

มันถูกใช้ในกรณีของวิธีการเรียน ตรวจสอบข้อมูลอ้างอิงนี้สำหรับรายละเอียดเพิ่มเติม

แก้ไข: ตามที่ชี้แจงโดย Adrien มันเป็นแบบแผน คุณสามารถใช้อะไรก็ได้ยกเว้นclsและselfถูกใช้ ( PEP8 )


52

clsหมายความว่าวิธีนี้เป็นของชั้นเรียนในขณะที่ตัวเองหมายถึงวิธีที่เกี่ยวข้องกับอินสแตนซ์ของชั้นเรียนดังนั้นสมาชิกที่มีการclsเข้าถึงโดยชื่อคลาสที่เป็นคนที่มีการเข้าถึงตัวเองโดยอินสแตนซ์ของชั้น ... มันเป็นแนวคิดเดียวกัน เป็นstatic memberและnon-static membersในจาวาถ้าคุณมาจากพื้นหลังจาวา


1
ขอบคุณสำหรับการอ้างอิง Java ตอนนี้เข้าใจ
Edenshaw

กว่าคุณจะกล่าวถึงstatic memberและnon-static membersเข้าใจในบริบทของ c ++
Amit JS

18

นี่เป็นคำถามที่ดีมาก แต่ไม่อยากเป็นคำถาม มีความแตกต่างระหว่างวิธีการใช้ 'ตัวเอง' และ 'cls' แม้ว่าจะอยู่ในที่เดียวกัน

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

ตอนนี้คุณสามารถเห็นได้ทั้งฟังก์ชั่นมูน แต่สามารถใช้ภายในคลาสในขณะที่ฟังก์ชั่นอื่น ๆ ชื่อมูนสามารถใช้สำหรับชั้นเรียนใด ๆ

สำหรับวิธีการเขียนโปรแกรมเชิงปฏิบัติ:

ในขณะที่ออกแบบคลาสของวงกลมเราใช้วิธีพื้นที่เป็น cls แทนตัวเองเพราะเราไม่ต้องการให้พื้นที่ถูก จำกัด เฉพาะคลาสของวงกลมเท่านั้น


หากคุณต้องการเพิ่มสิ่งที่ตัวแปลงสัญญาณที่ค้นหาถ้าถูกต้องจะอนุมัติ
TheExorcist

2

แทนที่จะยอมรับพารามิเตอร์ด้วยตนเองเมธอดของคลาสจะใช้พารามิเตอร์clsที่ชี้ไปยังคลาสนั้นไม่ใช่อินสแตนซ์ของวัตถุเมื่อเมธอดนั้นถูกเรียก เนื่องจากเมธอดคลาสมีการเข้าถึงอาร์กิวเมนต์ cls นี้เท่านั้นจึงไม่สามารถแก้ไขสถานะอินสแตนซ์ของวัตถุได้ ที่จะต้องเข้าถึงตัวเอง อย่างไรก็ตามวิธีการเรียนยังคงสามารถแก้ไขสถานะคลาสที่ใช้กับอินสแตนซ์ทั้งหมดของคลาส

- Python Tricks

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.