Вы можете сделать его недоступным для записи (немного отличным от неизменяемого), используя свойства, но нет возможности сделать его закрытым - это противоречит философии Python.
class Foo(object): # don't need 'object' in Python 3
@property
def thingies(self):
return 'thing1', 'thing2', 'thing3'
f = Foo()
print f.thingies
#('thing1', 'thing2', 'thing3')
f.thingies = 9
#Traceback (most recent call last):
# File "test.py", line 8, in <module>
# f.thingies = 9
#AttributeError: can't set attribute
Независимо от того, является ли оно неизменным илине зависит от того, что вы возвращаете;если вы возвращаете изменяемый объект, вы можете изменить его, чтобы в и эти изменения отображались в экземпляре / классе.
class FooMutable(object):
_thingies = [1, 2, 3]
@property
def thingies(self):
return self._thingies
foo = FooMutable()
foo.thingies.append(4)
print foo.thingies
# [1, 2, 3, 4]
Это позволит вам изменить thingies
, ипоскольку возвращаемый объект является тем же объектом, который хранится в экземпляре / классе, изменения будут отражены при последующем доступе.
Сравните это с:
class FooMutable(object):
@property
def thingies(self):
return [1, 2, 3]
foo = FooMutable()
foo.thingies.append(4)
print foo.thingies
# [1, 2, 3]
Поскольку каждый раз возвращается новый списоквремя, изменения к нему не отражаются в последующих доступах.