1. Class methods (using @classmethod decorator):
	- Purpose: Class methods operate on the class itself rather than specific instances. They are often used for:			- Factory methods: Creating objects with different configurations based on provided arguments.
- Utility functions: Performing actions related to the class as a whole, such as validation or data manipulation.
 
- Calling: You call class methods using the class name followed by a dot and the method name (e.g., ClassName.class_method()).
 
Example:
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    @classmethod
    def from_birth_year(cls, name, birth_year):
        age = 2024 - birth_year
        return cls(name, age)  # Returning a new instance
person1 = Person.from_birth_year("Alice", 1990)  # Call class method without creating Person first
 
########
 
 
2. Static methods (using @staticmethod decorator):
	- Purpose: Static methods are essentially regular functions defined within the class for reusability. They don't receive the class or instance automatically as arguments. They are useful for:			- Helper functions: Providing utility functions that don't rely on class or instance attributes and can be used independently.
- Mathematical or string manipulation functions: Implementing functions that don't necessarily relate to the class itself but can be conveniently grouped within the class.
 
- Calling: You call static methods similar to class methods (e.g., ClassName.static_method()).
 
example :
 
class Utility:
    @staticmethod
    def is_even(number):
        return number % 2 == 0
is_eight_even = Utility.is_even(8)  # Call static method without creating Utility first