[Tutor] How to write protect attributes or names
Alexandre Ratti
alex at gabuzomeu.net
Thu Sep 18 15:25:35 EDT 2003
Hello Gregor,
Gregor Lingl wrote:
> Alexandre Ratti schrieb:
>> 2) You could also use properties (in Python 2.2+) to create read-only
>> attributes:
>
> Hmmm..., interesting, but I want to write-protect methods, i.e. callable
> attributes. That will not work with properties
This reminds me of this document I read a few weeks ago about the
descriptor protocol:
How-To Guide for Descriptors, Raymond Hettinger
http://users.rcn.com/python/download/Descriptor.htm
I found it very interesting, though a bit complex. As I understand it,
properties are a special case of descriptors. A descriptor is basically
a go-between class that controls how you access an attribute or a method.
We could write a descriptor that wraps a normal method to prevent anyone
from remapping (or deleting) its name. This is based on the last example
in the "How-To Guide for Descriptors":
##
class Protector(object):
def __init__(self, f):
self.f = f
def __set__(self, *args):
print "Oh no. You cannot remap this method name."
def __delete__(self, *args):
print "Don't you even think of deleting this name!"
def __get__(self, obj, cls = None):
# When called from an instance,
# obj = instance and cls = class.
def f(*args):
return self.f(obj, *args)
return f
class Foo(object):
def _doer(self, arg):
"""Simulates a method that does something."""
return "toto: %s" % arg
doer = Protector(_doer)
##
Let's try it:
##
>>> f = Foo()
>>> f.doer('titi')
'toto: titi'
>>> f.doer(2)
'toto: 2'
>>> f.doer = "new name"
Oh no. You cannot remap this method name.
>>> del f.doer
Don't you even think of deleting this name!
##
Now you just need to find a way to automate the creation of the
descriptor methods for every callable name that starts with a specific
prefix. This example might be interesting:
http://groups.google.fr/groups?hl=fr&lr=&ie=UTF-8&oe=UTF-8&selm=just-AA3639.09530820052003%40news1.news.xs4all.nl
Overriding "__setattr__" might be more straightforward, though.
Cheers.
Alexandre
More information about the Tutor
mailing list