+ 3

Is there any way to make class attributes unchangeable, so one cannot change not for class, nor for the object of the class?

https://code.sololearn.com/ctML4CU5cKxh/?ref=app

25th Jan 2021, 5:18 AM
Alexander Grothendieck
Alexander Grothendieck - avatar
5 Answers
+ 9
Just mark it with underscore or double underscore in a variable to mark it as protected or private. I think it was mentioned there in the OOP lesson (in the yellow box) that variables in class are not unchangeable based on Python philosophy about encapsulation. _legs = 4 or __legs = 4 To access: object._className__attribute Though you can make the Class variable constant (not really) and unchangeable by using the __setattr__ dunder to change back the value of legs to 4 everytime the program is setting a new value to the attribute. See this for example: https://code.sololearn.com/ca3A56A19A0a
25th Jan 2021, 5:28 AM
noteve
noteve - avatar
+ 5
To add to what 《 Nicko12 》 has posted, Python doesn't have a true constant nor does it have true protected or private members like other languages (C, C++, Java, etc). Constants are more of a convention than anything. Using a prefixed underscore or double underscore will restrict access, but not prevent it completely. Here is some additional information: https://www.tutorialsteacher.com/python/public-private-protected-modifiers https://www.programiz.com/python-programming/variables-constants-literals https://medium.com/better-programming/does-python-have-constants-3b8249dc8b7b
25th Jan 2021, 5:41 AM
ChaoticDawg
ChaoticDawg - avatar
+ 2
《 Nicko12 》 regarding the using __setattr__ dunder: is it possible to detect, that the user tried to change the 'protected' attribute? If so, how to warn him? e.g. print out text: "You tried to change legs attribute by assigning it X(the value, that user tried to assign)." Is it possible?
25th Jan 2021, 6:01 AM
Alexander Grothendieck
Alexander Grothendieck - avatar
+ 2
I just found out that when using the Class name itself, the __setattr__ method is not called, I'll try to figure out to overload even when using the class name itself and not just the object. For now, here's what you've asked for. https://code.sololearn.com/ca7a217A24A1
25th Jan 2021, 6:32 AM
noteve
noteve - avatar
0
Yeah
26th Jan 2021, 4:40 PM
alireza bakhshi
alireza bakhshi - avatar