[python] ما هي الطريقة الأسهل والأكثر إيجازا لجعل السمات المحددة في أحد الأمثلة قابلة للقراءة؟



Answers

class C(object):

    def __init__(self):

        self.fullaccess = 0
        self.__readonly = 22 # almost invisible to outside code...

    # define a publicly visible, read-only version of '__readonly':
    readonly = property(lambda self: self.__readonly)

    def inc_readonly( self ):
        self.__readonly += 1

c=C()

# prove regular attribute is RW...
print "c.fullaccess = %s" % c.fullaccess
c.fullaccess = 1234
print "c.fullaccess = %s" % c.fullaccess

# prove 'readonly' is a read-only attribute
print "c.readonly = %s" % c.readonly
try:
    c.readonly = 3
except AttributeError:
    print "Can't change c.readonly"
print "c.readonly = %s" % c.readonly

# change 'readonly' indirectly...
c.inc_readonly()
print "c.readonly = %s" % c.readonly

هذه النواتج:

$ بيثون ./p.py
c.fullaccess = 0
c.fullaccess = 1234
c.readonly = 22
لا يمكن تغيير c.readonly
c.readonly = 22
c.readonly = 23

أصابعي حكة لتكون قادرة على القول

    @readonly
    self.readonly = 22

أي استخدام ديكور على السمة. ستكون نظيفة جدا ...

Question

في بيثون، أريد أن جعل سمات مثيلات محددة من فئة تكون القراءة للقراءة خارج الصف. أريد أن يكون هناك أي وسيلة خارج التعليمات البرمجية يمكن تغيير السمة، إلا بشكل غير مباشر عن طريق استدعاء أساليب على سبيل المثال. أريد أن يكون بناء الجملة موجزا. ما هي أفضل طريقة؟ (أعطي أفضل إجابة الحالية أدناه ...)




ليس هناك طريقة حقيقية للقيام بذلك. هناك طرق لجعلها أكثر 'صعبة'، ولكن ليس هناك مفهوم خفية تماما، والصفات فئة لا يمكن الوصول إليها.

إذا كان الشخص الذي يستخدم صفك لا يمكن الوثوق به لمتابعة مستندات أبي، فهذه هي مشكلته الخاصة. إن حماية الناس من القيام بالأشياء الغبية تعني فقط أنهم سيبذلون أشياء أكثر تعقيدا وتعقيدا وإلحاق الضرر بغبي محاولة القيام بما لا ينبغي أن يفعلوه في المقام الأول.




أنا أدرك أن وليام كيلر هو أنظف الحل حتى الآن .. ولكن هذا شيء جئت مع ..

class readonly(object):
    def __init__(self, attribute_name):
        self.attribute_name = attribute_name

    def __get__(self, instance, instance_type):
        if instance != None:
            return getattr(instance, self.attribute_name)
        else:
            raise AttributeError("class %s has no attribute %s" % 
                                 (instance_type.__name__, self.attribute_name))

    def __set__(self, instance, value):
        raise AttributeError("attribute %s is readonly" % 
                              self.attribute_name)

وهنا مثال الاستخدام

class a(object):
    def __init__(self, x):
        self.x = x
    xval = readonly("x")

للأسف هذا الحل لا يمكن التعامل مع المتغيرات الخاصة (__ اسمه المتغيرات).




Links