# Superclasses and subclasses

import random

class Point2D:
    def __init__(self, xPos, yPos):
        self._xPos = xPos
        self._yPos = yPos
    def draw(self):
        print(f"2D-Point at ({self._xPos},{self._yPos})")

class Point3D(Point2D):
    def __init__(self, xPos, yPos, zPos=0):
        super().__init__(xPos, yPos)
        self._zPos = zPos

    def draw(self):
        print(f"3D-Point at ({self._xPos},{self._yPos},{self._zPos})")

points = [(random.randint(1, 10), random.randint(1, 10), random.randint(1, 10)) for _ in range(1)]

print("Superclasses and subclasses:")
for x, y, z in points:
    p1 = Point2D(x, y)
    p1.draw()
    p2 = Point3D(x, y, z)
    p2.draw()

# Output:
# 2D-Point at (x,y)
# 3D-Point at (x,y,z)

# ----------------------------------

# Static method

class Calculator:

    @staticmethod
    def multiply(a, b):
        return a * b
    
print("\nStatic method 1st example:")
print("Result =", Calculator.multiply(3, 5))

# Output:
# Result = 15

# 2nd example

class Point:
    def __init__(self, xPos, yPos):
        self._xPos = xPos
        self._yPos = yPos
        
    @staticmethod
    def equal(p1, p2):
        return p1._xPos == p2._xPos and p1._yPos == p2._yPos

p1 = Point(3, 4)
p2 = Point(3, 4)

print("\nStatic method 2nd example:")
print("is equal:", Point.equal(p1, p2))    # Call without instance
print("is equal:", p1.equal(p1, p2))       # Call within instance

# Output:
# is equal: True
# is equal: True