Thi's avatar
HomeAboutNotesBlogTopicsToolsReading
About|My sketches |Cooking |Cafe icon Support Thi
💌 [email protected]

Python Classes & Objects

Anh-Thi Dinh
Python
Left aside

Classes vs Objects vs Instances vs Methods

  • Class is a blueprint/template of an object.
    • Each class has its own attributes (its states) and methods (its behaviors).
  • Object is a bundle of related attributes and methods.
  • Instance is a single and unique unit of a class.
    • Many instances may have the same class. They have attributes and methods defined in the class.

Syntactic sugar & self

Syntactic sugar is syntax within a programming language that is designed to make things easier to read or to express. For example, we use arr[i,j] but behind the scene, it's get_element(arr, vector(i,j)).
my_object.method('foo') means MyClass.method(my_object, 'foo'). That's why we need self or a decorator

Get all attributes of a class

Import local class

Suppose that we have a folders/files structure like below,
We want import both classes ABC and XYZ
Just add __init__.py like in the right box above.
Some errors may occur,

Father and Son

If you want son takes all parameters of father and use additional parameters,

Abstract Base Classes (ABC)

â—†Classes vs Objects vs Instances vs Methodsâ—†Syntactic sugar & selfâ—†Get all attributes of a classâ—†Import local classâ—†Father and Sonâ—†Abstract Base Classes (ABC)
About|My sketches |Cooking |Cafe icon Support Thi
💌 [email protected]
1class MyClass()
2    def method(arg):
3        print(arg)
4
5my_object = MyClass()
6my_object.method('foo')
7# TypeError: method() takes exactly 1 positional argument (2 given)
1class MyClass():
2    def method(self, arg):
3        print(arg)
1# DON'T NEED `self`
2class MyClass():
3    @staticmethod
4    def method(self, arg):
5        print(arg)
1# CHECK THERE IS AN ATTRIBUTE
2getattr(MyClass, 'report', None)
3# if there is a class, it return this class' detail
4# if not, return None
1def props(cls):
2    return [i for i in cls.__dict__.keys() if i[:1] != '_']
3
4# access these attributes
5properties = props(MyClass)
6for att in properties:
7    print(getattr(MyClass, att))
1# Get dictionaries of all attributes & their values
2MyClass.__dict__
1# ORIGINAL STRUCTURE
2popai/
3  processings/
4    a.py # contains class ABC
5    test/
6      b.py
7  lib/
8    c.py # contains class XYZ
1# UPDATED STRUCTURE
2popai/
3  __init__.py
4  processings/
5    __init__.py
6    a.py # contains class ABC
7    test/
8      __init__.py
9      b.py
10  lib/
11    c.py # contains class XYZ
1# b.py
2from popai.processings.a import ABC
1# a.py
2from popai.lib.c import XYZ
1ValueError: attempted relative import beyond top-level package
1# FATHER
2class father_class():
3  def __init__(self):
4    self.abc = 1
1# SON
2class son_class(father_class):
3  def __init__(self):
4    # son_class has attribute `abc`
5    super().__init__()
6    self.xyz = 2
1class Shape:
2    def __init__(self, shapename):
3        self.shapename = shapename
4
5class ColoredShape(Shape):
6    def __init__(self, color, **kwargs):
7        super().__init__(**kwargs)
8        self.color = color
9
10cs = ColoredShape(color='red', shapename='circle')
1from abc import ABC, abstractmethod
1# FATHER CLASS
2class BaseModel(ABC):
3  def __init__(self):
4    pass
5
6  # child class must have
7  @abstractmethod
8  def fit(self, X):
9    pass
10
11  # child class must have
12  @abstractmethod
13  def predit(self, X):
14    pass
15
16  # children class don't need to have
17  #   but they can call
18  def fit_predict(self, X):
19    pass
1# CHILD CLASS
2class LinearModel(BaseModel)
3  def __init__(self):
4    pass
5
6  # must-have
7  def fit(self, X):
8    pass
9
10  # must-have
11  def predict(self, X):
12    pass
13
14  # this call can use .fix_predict()
15  #   from its father!
16