لا يعمل الوصول إلى سمة تجاوز (كما هو متوقع)
-
18-09-2019 - |
سؤال
الهدف الرئيسي من الوحدة التالية، هو توفير نوع من دلالات "ثابت" لبعض الأسماء.
class ConstantError(Exception):
def __init__(self, msg):
self._msg = msg
class Constant(object):
def __init__(self, name):
self._name = name
def __get__(self, instance, owner):
return instance._content[self._name]
def __set__(self, instance, value):
raise ConstantError, 'Illegal use of constant'
class Constants(object):
def __init__(self, content):
self._content = content
for k in self._content:
setattr(self, k, Constant(k))
num_const = Constants({
'one': 1,
'two': 2
})
عند استخدامها:
>>> from const import *
>>> dir(num_const)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_content', 'one', 'two']
وبالتالي one
و two
هناك، ولكن الوصول السمة هو DiPpointing:
>>> num_const.one
<const.Constant object at 0x7faef4871710>
>>>
حيث أتوقع 1
في هذه الحالة. أين أنا مخطئ؟
المحلول
بروتوكول واصف يعمل فقط على سمات الفصل, ، ليس على سمات مثيلات الفصل. انظر كيفية توجيه لوائح
نصائح أخرى
أنت في عداد المفقودين ستر() أو Unicode.() طريقة في الثوابت.
يضيف:
def __unicode__(self):
return self._name
أعتقد أن بيثون يمنع الفصول الدراسية من الوصول إلى آلات واصف بحيث يمكن التلاعب بها. يمكن التلاعب بإخلال واصف أن يصبح صعبا للغاية دون نوع من وظيفة "السحرية"، وإذا لاحظت أن بيثون يحاول الاحتفاظ بالكثير من آلات اللغة التي يمكن الوصول إليها. للالتفاف حول هذا لقد أغلقت الفئة في كثير من الأحيان على الطاير. على سبيل المثال، يمكن إعلان فئة الثوابت مثل ذلك:
class Constants(object):
def __new__(cls, content):
class _Constants(object):
pass
constants = _Constants
constants._content = content
for k in constants._content:
setattr(_Constants, k, Constant(k))
return constants
ولكن حقا، بالنسبة لك لأغراض قد تكون أفضل من:
class Constants(object):
def __init__(self, content):
self._content = content
def __getattr__(self,key):
return self._content[key]