Python Data Science Jobs & Interviews
20.4K subscribers
188 photos
4 videos
25 files
327 links
Your go-to hub for Python and Data Science—featuring questions, answers, quizzes, and interview tips to sharpen your skills and boost your career in the data-driven world.

Admin: @Hussein_Sheikho
Download Telegram
What are the implications of using __slots__ in Python classes, and how can it affect memory usage, performance, and inheritance?

Answer:
Using __slots__ in Python classes allows you to explicitly declare the attributes a class can have, which reduces memory usage by preventing the creation of a dict__dict__ for each instance. This results in faster attribute access since attributes are stored in a fixed layout rather than a dictionary. However, __slots__ restricts the ability to add new attributes dynamically, disables certain fedictike __dict__ and __weakref__, and complicates multiple inheritance because of potential conflicts between slot definitions in parent classes.

For example:

class Point:
__slots__ = ['x', 'y']

def __init__(self, x, y):
self.x = x
self.y = y

p = Point(1, 2)
# p.z = 3 # This will raise an AttributeError

While `__slots__` improves memory efficiency—especially in classes with many instances—it must be used carefully, particularly when dealing with inheritance or when dynamic attribute assignment is needed.

#Python #AdvancedPython #MemoryOptimization #Performance #OOP #PythonInternals

By: @DataScienceQ 🚀
What is the difference between @classmethod and @staticmethod in Python, and when should each be used?

Answer:
@classmethod receives the class (cls) as its first argument and is used to define methods that operate on the class itself rather than instances. It can modify class state or create alternative constructors. @staticmethod, on the other hand, does not receive any implicit first argument (neither self nor cls) and behaves like a regular function bound to the class namespace. It cannot access or modify class or instance state.

For example:

class MyClass:
count = 0

def __init__(self):
MyClass.count += 1

@classmethod
def get_count(cls):
return cls.count

@staticmethod
def helper_method(x):
return x * 2

print(MyClass.get_count()) # 0 initially
obj = MyClass()
print(MyClass.get_count()) # 1
print(MyClass.helper_method(5)) # 10

Use `@classmethod for factory methods or operations affecting the class, and @staticmethod` for utility functions logically related to the class but independent of its state.

#Python #AdvancedPython #OOP #ClassMethods #StaticMethods #PythonInternals

By: @DataScienceQ 🚀
What is the purpose of __prepare__ in Python metaclasses, and how does it influence the creation of class dictionaries?

Answer:
The __prepare__ method is a class method defined in a metaclass that allows custom control over the namespace dictionary used when creating a new class. It is called before the class body executes and returns a dictionary-like object (e.g., dict, OrderedDict) that will serve as the class namespace. This enables metaclasses to define custom behaviors for attribute ordering, validation, or even use non-standard data structures.

For example:

class OrderedMeta(type):
@classmethod
def __prepare__(cls, name, bases, **kwargs):
return OrderedDict()

class MyClass(metaclass=OrderedMeta):
a = 1
b = 2

print(list(MyClass.__dict__.keys())) # ['a', 'b'] - ordered

By overriding __prepare__, you can ensure that class attributes are stored in a specific order or with additional constraints, making it powerful for frameworks requiring predictable attribute behavior.

#Python #AdvancedPython #Metaclasses #OOP #PythonInternals #CustomClassCreation

By: @DataScienceQ 🚀