Changing the private variables content
MRAB
python at mrabarnett.plus.com
Wed Jul 22 09:12:18 EDT 2009
Ryniek90 wrote:
>>
>> ------------------------------------------------------------------------
>>
>> Temat:
>> Re: Changing the private variables content
>> Od:
>> Gary Herron <gherron at islandtraining.com>
>> Data:
>> Tue, 21 Jul 2009 14:14:44 -0700
>> Do:
>> Ryniek90 <ryniek90 at gmail.com>
>>
>> Do:
>> Ryniek90 <ryniek90 at gmail.com>
>> Kopia:
>> python-list at python.org
>>
>>
>> Ryniek90 wrote:
>>> Hi.
>>> I'm writing some class, and decided to use inside private method and
>>> some private variables. While with method i haven't got any problem's
>>> with variables i have.
>>> Maybe some example.
>>> A class with private method and private variable:
>>>
>>> "
>>> >>> class Secret(object):
>>> #
>>> def __init__(self):
>>> self._number = 1
>>> #
>>> def _secret(self):
>>> print self._number
>>> def showit(self):
>>> print "Secret number is:\n"
>>> self._secret()
>>>
>>> >>> sec = Secret()
>>> >>> sec.showit()
>>> Secret number is:
>>>
>>> 1
>>> >>> sec._number
>>> 1
>>> >>> sec._number = 2
>>> >>> sec._number
>>> 2
>>> >>> sec._number += 3
>>> >>> sec._number
>>> 5
>>> >>>
>>> "
>>>
>>> As You can see, i made class with private method and private variable
>>> inside __init__ constructor. I've changed also the variable value,
>>> but outside class.
>>> I've got problem with changing some variable value _inside__my_
>>> class, which i'm writing.
>>
>> Not sure this is what you are asking, but a method (which is how I
>> interpret "_inside__my_ class") changes the value by normal assignment
>> like this:
>>
>> class Secret(object):
>> ...
>> def SetNumber(self,value):
>> self._number = value
>>
>> Is that what you were asking?
>>
>>
>> Gary Herron
>>
>>
>>
>>> I've searched over google, some tuts with topics about operations on
>>> private variables, but didn't found anything - only how to make them,
>>> but no how to assign new objects/override them with new content (and
>>> other advanced and helpful options).
>>>
>>> If someone could help me, it would be great.
>>>
>>> Thanks.
>>
>>
>
>
> Thanks for hint, but looks like i can't do what i want.
>
> Maybe i show You my class:
>
> "
>
> class ModPrint(object):
> u"""
> This will be the doc.
> """
> def __init__(self):
> #Assign the Python installation directory - sys.exec_prefix
> - to variable
> self._default_search_path=sys.exec_prefix
> self._chosen_module = ''
> self._user_search_path = ''
> self._this_module = ''
> def _SetVar(self, attr, val):
> self.attr = val def _search_for_module(self, *args):
> """Private method which walks through default Python
> installation directories, and search for prefered module."""
> #walking thru all directories available in path
> '_user_search_path'
> for root, dirs, files in os.walk(self._user_search_path):
> for f in files:
> #if found file 'f' is THAT module,
> #full path to THAT file is assigned to variable
> if f == ("%s.py" % self._chosen_module):
> self._SetVar(self._this_module, os.path.join(root, f))
> def print_module(self,
> _chosen_module='', _user_search_path='',
> _default_search_path=sys.exec_prefix,):
> """Reads module chosen by user, and returns full content of
> this module, as it is."""
> #if custom search path hasn't been assigned,
> #default path is being assigned as custom path
> if self._user_search_path == '':
> self._user_search_path = self._default_search_path
> #using private method '_search_for_module' with 'self.'
> preffix
> #to search for prefered module
> self._search_for_module(_chosen_module, _user_search_path)
> #opening prefered module with read-only binary mode
> #and assigning it to 'module_open' variable
> module_open = open(self._this_module, 'rb')
> #reading this file and assigning it to variable
> module_text = module_open.read()
> #closing read file; the read content is still available
> #it's stored in variable 'module_text'
> module_open.close()
> #returning the read content
> return module_text
>
> "
>
> When i use this class in Python IDLE, i've got this error:
> "
> >>> mod = ModPrint()
> >>> import socket
> >>> mod.print_module('socket')
>
> Traceback (most recent call last):
> File "<pyshell#60>", line 1, in <module>
> mod.print_module('socket')
> File "<pyshell#57>", line 48, in print_module
> module_open = open(self._this_module, 'rb')
> IOError: [Errno 2] No such file or directory: ''
> >>>
> "
>
> As You can see, i can't assign the new value "os.path.join(root, f)" to
> the 'self._this_module variable'.
> So for sure i've made some mistake in method:
>
> "
> def _SetVar(self, attr, val):
> self.attr = val "
> When i've changed private variables to normal, stored in class (in
> __init__ method), it was the same situation - i couldn't change this
> variable value.
>
> "
> >>> mod = ModPrint()
> >>> mod.print_module('os')
>
> Traceback (most recent call last):
> File "<pyshell#72>", line 1, in <module>
> mod.print_module('os')
> File "<pyshell#64>", line 48, in print_module
> module_open = open(self.this_module, 'rb')
> IOError: [Errno 2] No such file or directory: ''
> >>>
> "
>
> Thanks i someone could help me, give some hint.
What is the point of the _SetVar method?
Instead of:
self._SetVar(self._this_module, os.path.join(root, f))
just do:
self._this_module = os.path.join(root, f)
(unless I'm misunderstanding what you're trying to do!)
More information about the Python-list
mailing list