python - function and classes, usage of __str__ -
i having issues concerning interaction between functions, methods , have uncertainty of how utilize use of built-in function __str__.
to start of, have class called vara, looks like:
class vara(object): def __init__(self, kod, namn, pris, butikantal): self.kod = kod self.namn = namn self.pris = pris self.antal = butikantal and have function creats list of object vara klass, looks like:
def mina_varor(): varor_fran_fil = open("varor.txt", "r") varulista = [] rad in varor_fran_fil: varje_vara1 = rad varje_vara2 = varje_vara1.split("/") varorna = vara(varje_vara2[0], varje_vara2[1], varje_vara2[2], varje_vara2[3]) varulista.append(varorna) return(varulista) now want able access singel object in list typing "kod" object. cant find "kod" in list. seemed strange, tried printning list, , got that:
[<__main__.vara object @ 0x00000000031503c8>, <__main__.vara object @ 0x00000000031507f0>, <__main__.vara object @ 0x0000000003150710>, <__main__.vara object @ 0x00000000031502b0>, <__main__.vara object @ 0x00000000031505f8>, <__main__.vara object @ 0x00000000031504e0>]
i looked up, , seems python cant decide how interpret list. think need __str__ method so, how should make __str__ method if want print like:
name: hat price: 150 quantity: 100 code: 223 ?
issue 1: __str__() not being called when printing container
it's not python can't interpret list, doesn't know how expect displayed.
implement __str__ method if want like
print(varulista[0]) something following give expect list entry:
def __str__(self): s = "name: %s\n" % self.namn s += "price: %s\n" % self.pris s += "quantity:%s\n" % self.antal s += "code: %s\n" % self.kod but if want print(varulista) make sense, you'll have implement __repr__ method, since varulista list , when printing python looks __repr__ method.
but being said, idea of __repr__ able pass eval() , create equivalent object. go 1 of 2 ways:
1. ignore __repr__()/eval() interaction
in case, implement __repr__() want. remember method going called when item in container you're printing, keeping output single line might helpful. know unless unambiguously represent state of object in __repr__() output, won't able recreate equivalent object "down road" using eval().
2. (preferred option, imo) implement __repr__() correctly , don't print containers if don't way looks.
if output like
[item{name:"hat",price:150,quantity:100,code:223},item{name:"shirt",price:450,quantity:10,code:225}] is unfriendly because of how had implement __repr()__, don't print containers. in other words, don't use
print(varulista) but instead use
for item in varulista: print item which call __str__() method defined, human-friendly one.
edit: @bernie's links a great answer @alexmartelli regarding difference between __str__ , __repr__ worth linking twice.
issue 2: being able access list element it's code
you say
now want able access singel object in list typing "kod" object. cant find "kod" in list. seemed strange, tried printning list, , got that:
you have 2 main options here. (1) use dictionary keyed on item code. (2) search through list code using list comprehension. i'm going show (1), because think it's better alternative.
option 1: use dictionary keyed on item code
consider code:
# define convenience function add items dictionary def add_item(d,i): d[i.kod] = # create new dictionary items = {} # add items dictionary add_item(items, vara(223, "hat", 150, 100)) add_item(items, vara(225, "shirt", 450, 10)) you can access defined item items dictionary follows:
items[223] #<-- "hat" item items[225] #<-- "shirt" item
Comments
Post a Comment