سؤال

الهدف الرئيسي من الوحدة التالية، هو توفير نوع من دلالات "ثابت" لبعض الأسماء.

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]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top