لماذا لا يمكنني إضافة سمات مباشرة إلى أي كائن بيثون؟
-
05-07-2019 - |
سؤال
لدي هذا الرمز:
>>> class G:
... def __init__(self):
... self.x = 20
...
>>> gg = G()
>>> gg.x
20
>>> gg.y = 2000
وهذا الكود :
>>> from datetime import datetime
>>> my_obj = datetime.now()
>>> my_obj.interesting = 1
*** AttributeError: 'datetime.datetime' object has no attribute 'interesting'
من معرفتي بايثون، أود أن أقول ذلك datetime
يتجاوز setattr
/getattr
, ولكنني لست متأكدا.هل يمكنك إلقاء بعض الضوء هنا؟
يحرر:أنا لست مهتما على وجه التحديد datetime
.كنت أتساءل عن الأشياء بشكل عام.
المحلول
أعتقد أن تنفيذ استخدامات التاريخ والوقت __الفتحات__ لأداء أفضل.
عند الاستخدام __slots__
, ، يحتفظ المترجم بالتخزين للسمات المذكورة فقط، ولا شيء آخر.وهذا يوفر أداءً أفضل ويستخدم مساحة تخزين أقل، ولكنه يعني أيضًا أنه لا يمكنك إضافة سمات جديدة حسب رغبتك.
اقرأ المزيد هنا: http://docs.python.org/reference/datamodel.html
نصائح أخرى
وهو مكتوب في C
http://svn.python.org/ عرض / الثعبان / جذع / وحدات / datetimemodule.c؟ عرض = العلامات
ولا يبدو لتنفيذ setattr.
وعلى الرغم من أن المسألة قد تم الرد عليها؛ إذا كان أي شخص مهتم في الحل، وهنا مثال -
mydate = datetime.date(2013, 3, 26)
mydate.special = 'Some special date annotation' # doesn't work
...
class CustomDate(datetime.date):
pass
mydate = datetime.date(2013, 3, 26)
mydate = CustomDate(mydate.year, mydate.month, mydate.day)
mydate.special = 'Some special date annotation' # works