ในการรองรับการกำหนดแอตทริบิวต์โดยพลการอ็อบเจกต์ต้องการ 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
ตัวอย่างเช่นสามารถมีแอตทริบิวต์โดยพลการ แต่คุณต้องจ่ายค่าใช้จ่ายค่อนข้างพื้นที่สำหรับความยืดหยุ่นที่
แล้วถ้าคุณต้องการint
s ที่มีคุณสมบัติพิเศษเพียงอย่างเดียวfoobar
... ? มันเป็นความต้องการที่หายาก แต่ Python มีกลไกพิเศษสำหรับวัตถุประสงค์ ...
>>> class fint(int):
... __slots__ = 'foobar',
... def __init__(self, x): self.foobar=x+100
...
>>> asizeof.asizeof(fint(23))
80
... ไม่ได้ค่อนข้างเล็ก ๆ เป็นint
ใจคุณ! (หรือแม้กระทั่งสองint
s หนึ่งself
และหนึ่งself.foobar
- อันที่สองสามารถกำหนดใหม่ได้) แต่ดีกว่า a dint
.
เมื่อคลาสมี__slots__
แอตทริบิวต์พิเศษ (ลำดับของสตริง) ดังนั้นclass
คำสั่ง (แม่นยำยิ่งขึ้นเมตาคลาสเริ่มต้นtype
) จะไม่จัดให้ทุกอินสแตนซ์ของคลาสนั้นมี a __dict__
(ดังนั้นความสามารถในการมีแอตทริบิวต์โดยพลการ) เพียง จำกัด ชุด "ช่อง" แบบแข็ง (โดยทั่วไปจะเป็นตำแหน่งที่แต่ละชิ้นสามารถอ้างอิงถึงวัตถุบางอย่างได้) พร้อมชื่อที่กำหนด
ในการแลกเปลี่ยนสำหรับความยืดหยุ่นที่หายไปคุณจะได้รับจำนวนมากของไบต์ต่อเช่น (อาจจะมีความหมายเฉพาะถ้าคุณมี zillions กรณี gallivanting รอบ แต่มีอยู่กรณีการใช้งานสำหรับที่)
object
ประเภทไม่เปลี่ยนรูปและไม่สามารถเพิ่มคุณสมบัติใหม่ได้? ดูเหมือนว่ามันจะเข้าท่าที่สุด