ในการรองรับการกำหนดแอตทริบิวต์โดยพลการอ็อบเจกต์ต้องการ a __dict__: dict ที่เชื่อมโยงกับอ็อบเจ็กต์ซึ่งสามารถจัดเก็บแอ็ตทริบิวต์ตามอำเภอใจได้ มิฉะนั้นจะไม่มีที่ให้ใส่แอตทริบิวต์ใหม่ได้
ตัวอย่างของการobjectไม่ได้ดำเนินการรอบ__dict__- ถ้ามันไม่ได้ก่อนที่ปัญหาการพึ่งพาอาศัยกันที่น่ากลัววงกลม (ตั้งแต่dictเช่นทุกอย่างอื่นมากที่สุด, สืบทอดจากobject;-) นี้จะอานทุกวัตถุในหลามกับกิงดิคซึ่งจะหมายถึงค่าใช้จ่าย ของหลายไบต์ต่อวัตถุว่าขณะนี้ไม่ได้หรือต้อง Dict (ส่วนวัตถุทั้งหมดที่ไม่ได้มีแอตทริบิวต์มอบหมายโดยพลการไม่ได้หรือต้องการ Dict ก)
ตัวอย่างเช่นการใช้pymplerโครงการที่ยอดเยี่ยม(คุณสามารถรับผ่าน svn ได้จากที่นี่ ) เราสามารถทำการวัดได้ ... :
>>> from pympler import asizeof
>>> asizeof.asizeof({})
144
>>> asizeof.asizeof(23)
16
คุณไม่ต้องการให้ทุกคนintใช้ 144 ไบต์แทนที่จะเป็น 16 ใช่ไหม -)
ตอนนี้เมื่อคุณสร้างคลาส (สืบทอดจากอะไรก็ตาม) สิ่งต่างๆก็เปลี่ยนไป ... :
>>> class dint(int): pass
...
>>> asizeof.asizeof(dint(23))
184
ที่ ... __dict__ ถูกเพิ่มในขณะนี้ (บวกเล็ก ๆ น้อย ๆ ค่าใช้จ่าย) - ดังนั้นdintตัวอย่างเช่นสามารถมีแอตทริบิวต์โดยพลการ แต่คุณต้องจ่ายค่าใช้จ่ายค่อนข้างพื้นที่สำหรับความยืดหยุ่นที่
แล้วถ้าคุณต้องการints ที่มีคุณสมบัติพิเศษเพียงอย่างเดียวfoobar ... ? มันเป็นความต้องการที่หายาก แต่ Python มีกลไกพิเศษสำหรับวัตถุประสงค์ ...
>>> class fint(int):
... __slots__ = 'foobar',
... def __init__(self, x): self.foobar=x+100
...
>>> asizeof.asizeof(fint(23))
80
... ไม่ได้ค่อนข้างเล็ก ๆ เป็นintใจคุณ! (หรือแม้กระทั่งสองints หนึ่งselfและหนึ่งself.foobar- อันที่สองสามารถกำหนดใหม่ได้) แต่ดีกว่า a dint.
เมื่อคลาสมี__slots__แอตทริบิวต์พิเศษ (ลำดับของสตริง) ดังนั้นclassคำสั่ง (แม่นยำยิ่งขึ้นเมตาคลาสเริ่มต้นtype) จะไม่จัดให้ทุกอินสแตนซ์ของคลาสนั้นมี a __dict__(ดังนั้นความสามารถในการมีแอตทริบิวต์โดยพลการ) เพียง จำกัด ชุด "ช่อง" แบบแข็ง (โดยทั่วไปจะเป็นตำแหน่งที่แต่ละชิ้นสามารถอ้างอิงถึงวัตถุบางอย่างได้) พร้อมชื่อที่กำหนด
ในการแลกเปลี่ยนสำหรับความยืดหยุ่นที่หายไปคุณจะได้รับจำนวนมากของไบต์ต่อเช่น (อาจจะมีความหมายเฉพาะถ้าคุณมี zillions กรณี gallivanting รอบ แต่มีอยู่กรณีการใช้งานสำหรับที่)
objectประเภทไม่เปลี่ยนรูปและไม่สามารถเพิ่มคุณสมบัติใหม่ได้? ดูเหมือนว่ามันจะเข้าท่าที่สุด