# Learn Special Methods by Building a Vector Space - Step 23

### Tell us what’s happening:

I don’t understand the instructions. How do I use getattr? And the help talking about vars(self) doesn’t help…

class R2Vector:
def __init__(self, *, x, y):
self.x = x
self.y = y

def norm(self):
return sum(val**2 for val in vars(self).values())**0.5

# User Editable Region

def __str__(self):
return f'({", ".join(str(i) for i in getattr(self))})'

# User Editable Region

class R3Vector(R2Vector):
def __init__(self, *, x, y, z):
super().__init__(x=x, y=y)
self.z = z

v1 = R2Vector(x=2, y=3)
v2 = R3Vector(x=2, y=2, z=3)
print(v1.norm())
print(v2.norm())

User Agent is: Mozilla/5.0 (X11; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0

### Challenge Information:

Learn Special Methods by Building a Vector Space - Step 23

getattr() function is what you need. It takes an object as its first argument, and a string containing the attribute name as its second attribute.

So, getattr() will take 2 arguments: object, attribute

getattr(object, 'attribute')

Use vars(self) to iterate through the object attributes as you did in a previous step.

replacing the string returned by __str__() with a generator expression

You are still returning a string. Instead, you want to return a generator expression, which will be a comprehension in (parentheses)

Thank you! I was not sure about the return type. Often the steps are too many. It could be easier if several steps were grouped together.