D
dmytro starosud
Hello,
I'm Python beginner (from Ukraine).
I may have found the way to really hide attributes in Python class.
The whole control on this attribute is implemented inside of the
class.
*(code is below, Python 3)
You see that we can't get the reference to instance of class
"en_property" outside the class "segment", but in the inside we can.
*It seems like there is no way to get the reference to field
“en_property.v_min” or “en_property.v_max”.
And object “s” has “two” attributes “v_min”: “s.__dict__['v_min']” and
“s.v_min”.
Help me find the answer, Can I change this hidden attribute outside
the class?
Or is it just an interesting feature?
....and Python has a "really hidden encapsulation"?
code:
class en_property(property):
ptr_pget = None
ptr_pset = None
def pset(self, _class, value):
self.ptr_pset(self, _class, value)
def pget(self, _class):
return self.ptr_pget(self, _class)
def __init__(self, pget, pset):
property.__init__(self, self.pget, self.pset)
self.ptr_pget = pget
self.ptr_pset = pset
class segment():
def min_set(prop, self, p_min):
if (self.v_max is not None) and (p_min > self.v_max):
raise AttributeError('It must be: "min < max"')
else:
prop.v_min = p_min
def min_get(prop, self):
if 'v_min' in dir(prop):
return prop.v_min
def max_set(prop, self, p_max):
if (self.v_min is not None) and (p_max < self.v_min):
raise AttributeError('It must be: "min < max"')
else:
prop.v_max = p_max
def max_get(prop, self):
if 'v_max' in dir(prop):
return prop.v_max
v_min = en_property(min_get, min_set)
del min_set, min_get
v_max = en_property(max_get, max_set)
del max_set, max_get
..............................................................................Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "D:\_dimka\I_Master\Programs_PyPg\enca.py", line 6, in pset
self.ptr_pset(self, _class, value)
File "D:\_dimka\I_Master\Programs_PyPg\enca.py", line 19, in min_set
raise AttributeError('It must be: "min < max"')
AttributeError: It must be: "min < max"
I'm Python beginner (from Ukraine).
I may have found the way to really hide attributes in Python class.
The whole control on this attribute is implemented inside of the
class.
*(code is below, Python 3)
You see that we can't get the reference to instance of class
"en_property" outside the class "segment", but in the inside we can.
*It seems like there is no way to get the reference to field
“en_property.v_min” or “en_property.v_max”.
And object “s” has “two” attributes “v_min”: “s.__dict__['v_min']” and
“s.v_min”.
Help me find the answer, Can I change this hidden attribute outside
the class?
Or is it just an interesting feature?
....and Python has a "really hidden encapsulation"?
code:
class en_property(property):
ptr_pget = None
ptr_pset = None
def pset(self, _class, value):
self.ptr_pset(self, _class, value)
def pget(self, _class):
return self.ptr_pget(self, _class)
def __init__(self, pget, pset):
property.__init__(self, self.pget, self.pset)
self.ptr_pget = pget
self.ptr_pset = pset
class segment():
def min_set(prop, self, p_min):
if (self.v_max is not None) and (p_min > self.v_max):
raise AttributeError('It must be: "min < max"')
else:
prop.v_min = p_min
def min_get(prop, self):
if 'v_min' in dir(prop):
return prop.v_min
def max_set(prop, self, p_max):
if (self.v_min is not None) and (p_max < self.v_min):
raise AttributeError('It must be: "min < max"')
else:
prop.v_max = p_max
def max_get(prop, self):
if 'v_max' in dir(prop):
return prop.v_max
v_min = en_property(min_get, min_set)
del min_set, min_get
v_max = en_property(max_get, max_set)
del max_set, max_get
..............................................................................Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "D:\_dimka\I_Master\Programs_PyPg\enca.py", line 6, in pset
self.ptr_pset(self, _class, value)
File "D:\_dimka\I_Master\Programs_PyPg\enca.py", line 19, in min_set
raise AttributeError('It must be: "min < max"')
AttributeError: It must be: "min < max"
s.__dict__['v_min'] = 2
s.__dict__['v_min'] 2
s.v_min -1