แม้ว่าแอนเวอร์ที่ยอมรับนั้นจะเป็นจุดสนใจ แต่ฉันต้องการเพิ่มคำอธิบายเล็กน้อย
มาออกกำลังกายกันเถอะ
ก่อนอื่นให้นิยามคลาสดังนี้:
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
แล้วเรามีอะไรอยู่ที่นี่?
- เรามีคลาสที่ง่ายมากซึ่งมีคุณสมบัติ
temp
ซึ่งเป็นสตริง
__init__
วิธีการที่ชุดself.x
- ชุดวิธีการเปลี่ยนแปลง
self.temp
ตรงไปตรงมาสวยใช่มั้ย ตอนนี้เรามาเริ่มเล่นกับคลาสนี้กัน มาเริ่มคลาสนี้กันก่อน:
a = A('Tesseract')
ตอนนี้ทำต่อไปนี้:
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
ดีa.temp
ทำงานตามที่คาดไว้ แต่วิธีนรกไม่A.temp
ทำงานหรือไม่ มันทำงานได้ดีเพราะ temp เป็นคุณสมบัติคลาส ทุกอย่างในหลามเป็นวัตถุ นี่คือวัตถุของคลาสtype
ด้วย ดังนั้น attribute temp จึงเป็น attribute ที่เก็บไว้ในA
class และหากคุณเปลี่ยนค่าของ temp through A
(และไม่ผ่านอินสแตนซ์ของa
) ค่าที่เปลี่ยนแปลงจะถูกแสดงในอินสแตนซ์ทั้งหมดของA
คลาส ไปข้างหน้าและทำสิ่งนั้น:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
น่าสนใจใช่ไหม และทราบว่าid(a.temp)
และid(A.temp)
ยังคงเหมือนเดิมยังคงเดิม
วัตถุ Python ใด ๆ จะได้รับ__dict__
แอตทริบิวต์โดยอัตโนมัติซึ่งมีรายการแอตทริบิวต์ มาตรวจสอบว่าพจนานุกรมนี้มีอะไรสำหรับวัตถุตัวอย่างของเรา:
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
โปรดทราบว่าtemp
คุณลักษณะนั้นจะแสดงอยู่ในหมู่A
แอตทริบิวต์ของคลาสขณะที่x
มีการระบุไว้สำหรับอินสแตนซ์
แล้วทำไมเราถึงได้ค่าที่กำหนดa.temp
ว่าถ้ามันไม่อยู่ในรายการสำหรับอินสแตนซ์นั้นa
นั้น นั่นคือความมหัศจรรย์ของ__getattribute__()
วิธีการ ใน Python ไวยากรณ์ของจุดประเรียกวิธีนี้โดยอัตโนมัติดังนั้นเมื่อเราเขียนa.temp
Python จะดำเนินการa.__getattribute__('temp')
รันหลาม วิธีการดังกล่าวดำเนินการค้นหาแอ็ตทริบิวต์เช่นค้นหาค่าของแอททริบิวต์โดยการค้นหาในที่ต่างๆ
การดำเนินการตามมาตรฐานของ__getattribute__()
การค้นหาอันดับแรกของพจนานุกรมภายใน ( dict ) ของวัตถุจากนั้นชนิดของวัตถุนั้น ในกรณีนี้a.__getattribute__('temp')
ดำเนินการครั้งแรกa.__dict__['temp']
แล้วa.__class__.__dict__['temp']
ตกลงตอนนี้มาใช้ของเรา change
วิธีการ :
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
ตอนนี้ที่เราได้ใช้ self
แล้วprint(a.temp)
ให้คุณค่าที่แตกต่างจากprint(A.temp)
เรา
ตอนนี้ถ้าเราเปรียบเทียบid(a.temp)
และid(A.temp)
พวกเขาจะแตกต่างกัน
list
เป็นชื่อแอตทริบิวต์list
เป็นฟังก์ชั่นในการสร้างรายการใหม่ คุณควรเขียนคลาสชื่อด้วยอักษรตัวใหญ่