2015-11-23 5 views
3

Я создал объект класса с именем «Node». Затем я создал два подкласса «Beetle» и «Dakota». Вы заметите, что есть attr, называемый «суперкласс», который является частью базового слоя. Я хочу, чтобы этот атрибут был установлен для каждого подкласса, и как только он установлен, он никогда не должен изменяться. Это атрибут только для чтения. Мне было интересно, как правильно установить этот атрибут, чтобы быть атрибутом только для чтения?python: установить атрибут только для чтения для объектов класса

class Node(object): 
    def __init__(self, name, superclass, attributes, children): 
     self.name = name 
     self.superclass = superclass 
     self.attributes = attributes if attributes is not None else {} 
     self.children = children if children is not None else [] 


    class Beetle(Node): 
     def __init__(self, name="", superclass="Cars", attributes=None, children=None, enabled=True): 
      super(Beetle, self).__init__(name=name, superclass=superclass, attributes=attributes, children=children) 
      self.enabled = enabled 


    class Dakota(Node): 
     def __init__(self, name="", superclass="Trucks", attributes=None, children=None, enabled=True): 
      super(Dakota, self).__init__(name=name, superclass=superclass, attributes=attributes, children=children) 
      self.enabled = enabled 
+0

Ответы на [этот вопрос] (http://stackoverflow.com/questions/14594120/python-read-only-property) кажутся актуальными. – kwinkunks

ответ

1

Переименовать вы переменную добавить __ в начале

self.__superclass = superclass 

вы не можете получить доступ к self.__superclass с чем-то вроде Dakota().__superclass

, если вы хотите, чтобы получить значение __superclass добавить функцию в Node классе, чтобы вернуть его.

def getsuperclass(self): 
    return self.__superclass 
... 

Dakota().getsuperclass() 
+0

Что делать, если я префиксал его только одним _, тогда я смогу получить его на Dakota() ._ superclass – JokerMartini

+0

Да. Вы можете получить его по адресу 'Dakota() ._ superclass'. – Zety

+0

это все еще только для чтения? – JokerMartini

1

Чтобы иметь свойство «только для чтения» в классе, вы можете использовать украшение @property.

Пример:

class Dakota(object): 
def __init__(self, superclass): 
    self.__superclass = superclass 

    @property 
    def superclass(self): 
     return self.__superclass 

Использование:

>>> a = Dakota('lol') 
>>> a.superclass 
'lol' 
>>> a.superclass = 'hah' 
AttributeError...  

AttributeError: can't set attribute 

Вы можете обратиться к этой другой answer thread

+0

Почему этот ответ ниспровергнут? Пожалуйста, укажите причину. –