I am trying to create a class diffStr that behaves like str except, when a user tries to add or multiply two strings, the output is the length of each string added or multiplied (respectively).
My code -
class diffStr:
def __init__(self, str1):
self.str1 = str1
def __add__(self, other):
return len(self.str1) len(other.str1)
def __mul__(self, other):
return len(self.str1) * len(other.str1)
x = diffStr('hi')
print(x 'hello') # supposed to print 7 (2 5)
print(x*'hello') # supposed to print 10 (2*5)
I am sure I am doing something wrong because I keep getting the following error message when I try to run the code -
AttributeError: 'str' object has no attribute 'str1'
As you can probably tell, I am a noob at programming and trying my best to learn. I would appreciate any help in fixing this block of code. Thank you.
CodePudding user response:
With x 'hello', you're passing a str object of 'hello' as the other argument to x.__add__, which evaluates other.str1, and since a str object has no str1 attribute, you get the said exception.
A better-rounded approach that helps make the and * operators work for both str and diffStr operands would be to implement the __len__ method for diffStr, so that you can simply call the len function on the other argument regardless of its type:
class diffStr:
def __init__(self, str1):
self.str1 = str1
def __add__(self, other):
return len(self.str1) len(other)
def __mul__(self, other):
return len(self.str1) * len(other)
def __len__(self):
return len(self.str1)
x = diffStr('hi')
print(x 'hello')
print(x * 'hello')
print(x diffStr('hello'))
print(x * diffStr('hello'))
This outputs:
7
10
7
10
