9
votes

So I have the following code in which the value of a dictionary is an object, and the key to that object is an item in the object as such:

class MyObject():
    def getName(self):
       return self.name

    def getValue(self):
       return self.value

    def __init__(self,name, value):
       self.name = name
       self.value = value


dict = {}
object = MyObject('foo', 2) //foo is the name, 2 is the value
dict[object.getName()] = object

However I cannot access the object like so:

>>>print dict['foo'].getValue()
<bound method object.getValue of <__main__.object instance at 0xFOOBAR000 >>

Is there a way I can access the object in this manner?

EDIT:

I don't know why but my code finally decided to start working, so for anyone haveing similar issues the above code is valid and should work. My current version of Python is 2.7.3

1
Yes you can. Your example works for me. How does it fail for you? Do you get an error? - BrenBarn
No error, I am getting <bound method object.value of <__main__.object instance at {some address}>> - Blackninja543
Your pasted code has no methods, so that doesn't make sense. Please post the actual code you are running. - BrenBarn
Your new example makes use of methods that you don't show (like getName and getValue), so it's hard to know for sure what's up. My guess would be that you want to do object.getName() and object.getValue() (note the parentheses). - BrenBarn
Now it should be fully updated to reflect the nature of the types of calls I am making. - Blackninja543

1 Answers

12
votes

You always need to include parentheses when calling functions, so write:

dict['foo'].getValue()

Also, the getValue method should accept a self parameter and access instance attributes through it:

def getValue(self):
    return self.value

Finally, that programming style, where every attribute is accompanied by a "getter", is discouraged in Python. It is easy enough to implement calculated slots, so there is no need for getters.

Names such as dict and object are also highly discouraged because they conflict with built-in types of the same name.

EDIT
The code was edited in the meantime, rendering some of the above remarks obsolete. The latest version of the posted code appears to work just fine when pasted into Python.