Thanks to everyone that has helped on this. What I am trying to do is create a capability based api that I can build to order. This is as far as I get at the moment.
Each of the first three classes represents some function I can do to a radio, there would be many of these in practice. The next class is the API. I figure I have to include all the possible radio function classes in this as I can't figure out how to make the classes I include per instance. When I create the API object I pass in a capability array as in the last class. I use these classes as follows.
>>> import capability as c
>>> import radioapi as r
>>> caps = c.Capability()
>>> cap = caps.getCaps('SDR1000')
>>> cap
['mode', 'freq', 'blanker']
>>> api = r.API(cap)
>>> r.caps
['mode', 'freq', 'blanker']
>>> api.mode
Retrieving mode var "mode"
'lsb'
>>> api.freq
Retrieving freq var "freq"
7.0800000000000001
>>> api.blanker
Retrieving blanker var "blanker"
1
>>> hasattr(api, 'monitor')
0
This is the behaviour I want, each class responds if it is in the capability array. The user can test attributes with hasattr(klass, 'att') to see if it is supported. I can create another instance with a different radio and it will respond accordingly. The problem of course is that in class API, caps is global so as soon as I create another instance the first starts responding to the new capability. If I try to make caps per instance I get into all sorts of trouble with recursion. Does anyone have an idea how to fix this or is it just impossible to make this work.
Regards
Bob
class Mode(object):
def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print 'Retrieving mode', self.name
return self.val
def __set__(self, obj, val):
print 'Updating mode' , self.name
self.val = val
import capability
class Freq(object):
def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print 'Retrieving freq', self.name
return self.val
def __set__(self, obj, val):
print 'Updating freq' , self.name
self.val = val
class Blanker(object):
def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print 'Retrieving blanker', self.name
return self.val
def __set__(self, obj, val):
print 'Updating blanker' , self.name
self.val = val
class API(object):
# create all possible radio classes
mode=Mode('lsb', 'var "mode"')
freq=Freq(7.080, 'var "freq"')
blanker=Blanker(True, 'var "blanker"')
global caps
caps = []
def __init__(self, pcaps):
global caps
caps = pcaps
def __getattribute__(self, key):
global caps
if (key in caps) or (key == 'caps'):
obj = object.__getattribute__(self, key)
if hasattr(obj, "__get__"):
return obj.__get__()
return obj
else:
raise AttributeError, "unreadable attribute"
class Capability(object):
m_cap = {
'SDR1000': ['mode','freq','blanker'],
'MyRig': ['mode','freq'],
'YourRig': ['mode', 'blanker']
}
def getCaps(self, radio):
return self.m_cap[radio]
*** Confidentiality Notice ***
Proprietary/Confidential
Information belonging to CGI Group Inc. and its
affiliates
may be contained in this message. If you are not a
recipient
indicated or intended in this message (or responsible
for
delivery of this message to such person), or you think for
any reason
that this message may have been addressed to you
in error, you may not use or
copy or deliver this message
to anyone else. In such case, you should
destroy this
message and are asked to notify the sender by reply
email.
-- http://mail.python.org/mailman/listinfo/python-list