NameError: ไม่ได้กำหนดชื่อ 'ตนเอง'


145

ทำไมโครงสร้างดังกล่าว

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

ให้ข้อผิดพลาดNameError: name 'self' is not definedหรือไม่?

คำตอบ:


159

ค่าอาร์กิวเมนต์เริ่มต้นจะถูกประเมินที่ฟังก์ชันกำหนดเวลา แต่selfเป็นอาร์กิวเมนต์ที่มีให้เฉพาะในเวลาเรียกใช้ฟังก์ชันเท่านั้น ดังนั้นข้อโต้แย้งในรายการอาร์กิวเมนต์ไม่สามารถอ้างถึงซึ่งกันและกัน

เป็นรูปแบบทั่วไปในการเริ่มต้นการโต้แย้งNoneและเพิ่มการทดสอบในรหัส:

def p(self, b=None):
    if b is None:
        b = self.a
    print b

4
แม้ว่าฉันคิดว่าข้างต้นไม่ได้สวยมาก (ฉันมาจากทับทิมที่สิ่งต่าง ๆ ทำงานได้ดี) การใช้งานจริงเป็นวิธีแก้ปัญหา ยังคงแปลกใจที่หลามเลือกที่จะทำให้ตัวเองไม่สามารถใช้งานได้ในรายการพารามิเตอร์
shevy

2
@shevy: "ตัวเอง" ไม่มีความหมายพิเศษในหลามมันเป็นเพียงชื่อที่เลือกตามอัตภาพสำหรับอาร์กิวเมนต์แรก คุณสามารถแทนที่ "self" ด้วย "me" หรือ "x"
Max

ไม่มีวิธีที่ดีกว่าในการทำเช่นนี้? หากเรามีฟังก์ชั่นที่ใช้อาร์กิวเมนต์เริ่มต้นโหลที่ควรอ้างอิงตนเองเราจำเป็นต้องมีโหลจริงๆไหมถ้ามีคำสั่ง? นี่มันช่างน่าอึดอัดใจมาก
Richard J. Barbalace

16

สำหรับกรณีที่คุณต้องการให้ตัวเลือกการตั้งค่า 'b' เป็นไม่มี:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b

6

หากคุณมาถึงที่นี่ผ่านทาง google โปรดตรวจสอบให้แน่ใจว่าคุณได้ให้ตัวเองเป็นพารามิเตอร์แรกของฟังก์ชั่นการเรียน โดยเฉพาะอย่างยิ่งถ้าคุณพยายามอ้างอิงค่าสำหรับวัตถุนั้นภายในฟังก์ชัน

def foo():
    print(self.bar)

> NameError: ไม่ได้กำหนดชื่อ 'ตนเอง'

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