[EMAIL PROTECTED] wrote:
class baseClass(object):
        __Something = "Dumb!"

        def getSomething( self ):
                return self.__Something

class subClass(baseClass):
        def setSomething( self , aSomething ):
                self.__Something = aSomething


anObject = subClass() anObject.setSomething("Cool!") print anObject.getSomething()

Your mistake is using '__' names when they aren't necessary. '__' names are mangled with the class name:


py> class B(object):
...     __x = False
...     def __init__(self):
...         self.__x = 1
...     def getx(self):
...         return self.__x
...
py> class C(object):
...     def setx(self, x):
...         self.__x = x
...
py> vars(B())
{'_B__x': 1}
py> vars(C())
{}

Note that C instances don't get __x variables because of the mangling.

Someone please show me the pythonish way to do this!

A number of suggestions:

(1) Generally, you don't need getters and setters. If you think you do, you probably want property instead.

(2) Don't use __ names. They're a hack that doesn't really make things private, and doesn't even avoid name collisions all the time. There are probably a few cases where they're useful, but this is not one of them. If you don't want attributes to show up in automatically generated documentation, simply prefix them with a single underscore.

(3) Don't use class-level attributes as defaults for instance-level attributes. If it's part of the instance, set it on the instance. If it's part of the class, set it on the class. Hiding a class-level attribute with an instance-level attribute will most likely lead to confusion unless you *really* know what you're doing in Python.

Something like this would probably be best:

py> class BaseClass(object):
...     def __init__(self, something='Dumb!'):
...         self._something = something
...     def _getsomething(self):
...         return self._something
...     something = property(_getsomething)
...
py> class SubClass(BaseClass):
...     def _setsomething(self, something):
...         self._something = something
...     something = property(BaseClass._getsomething, _setsomething)
...
py> b = BaseClass()
py> b.something
'Dumb!'
py> b.something = 1
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
AttributeError: can't set attribute
py> s = SubClass()
py> s.something
'Dumb!'
py> s.something = 'Cool!'
py> s.something
'Cool!'

STeVe
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to