![]() |
|
Inheritance from complex - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Inheritance from complex (/thread-38808.html) |
Inheritance from complex - konverner - Nov-27-2022 Hello I want to create a class "Point" that is a child from Python's complex class. Here is my code class Point(complex):
def __init__(self, **kwargs):
keys = set(kwargs.keys())
if {'x','y'} in keys:
self.z = complex(kwargs['x'], kwargs['y'])
if {'z'} in keys and self.z != complex(kwargs['z']):
raise ValueError("'x' and 'y' provided are not consistent with 'z' provided")
else:
self.z = complex(kwargs['z'])
self.x = self.z.real
self.y = self.z.imag
complex.__init__(self, self.x, self.y)
def distance(self, other) -> float:
return ((self.real - other.real)**2 + (self.imag - other.imag)**2)**(0.5)
def __str__(self) -> str:
return f'({self.real}, {self.imag})'But it does not work in this case:p = Point(x=1, y=2) --- TypeError: 'x' is an invalid keyword argument for complex()I am confused with it since the example below is similar and it works well: class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
class Student(Person):
def __init__(self, **kwargs):
self.group = kwargs['group']
Person.__init__(self, kwargs['name'], kwargs['surname'])
s = Student(name='John', surname='Harris', group='123')What is the problem of it? It is Python 3.7.15
RE: Inheritance from complex - Gribouillis - Nov-27-2022 Try this code. Use the method __new__ to subclass fundamental builtin types class Point(complex):
def __new__(cls, **kwargs):
z = kwargs.get('z', None)
if z is None:
self = complex.__new__(cls, real=kwargs['x'], imag=kwargs['y'])
else:
self = complex.__new__(cls, z.real, z.imag)
return self
@property
def x(self):
return self.real
@property
def y(self):
return self.imag
def distance(self, other) -> float:
return abs(self - other)
def __str__(self) -> str:
return f'({self.real}, {self.imag})'
p = Point(x=1, y=2)
print(p)
print(p.x)
|