Welcome back to the Python 3 Deep Dive series. In previous parts, we explored iterators, generators, decorators, and context managers. Now, we turn our attention to the very backbone of large-scale Python applications: Object-Oriented Programming (OOP).
def __call__(self, value): return value * self.factor def __init__(self, x, y): self.x = x self.y = yclass PositiveNumber:
def __set_name__(self, owner, name):
self.name = name
def __get__(self, instance, owner):
return instance.__dict__.get(self.name)
10. Best Practices & Anti-Patterns
✅ Do:
- Favor composition over deep inheritance.
- Use
@property for computed attributes.
- Implement protocols for custom containers.
- Use
super() consistently in multiple inheritance.
- Use ABCs for clear interfaces.
- Use
__slots__ for many small objects.
print(D.mro)
s = Simple()
s.x = 10
print(s.__dict__)
# Output: 'x': 10