5.4. Classmethod

5.4.1. Rationale

  • Using class as namespace

  • Will pass class as a first argument

  • self is not required

5.4.2. Examples

import json


class JSONMixin:
    def to_json(self):
        return json.dumps(self.__dict__)

    @classmethod
    def from_json(cls, data):
        data = json.loads(data)
        return cls(**data)


class User:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    def __str__(self):
        cls = self.__class__.__name__
        return f'{cls}(firstname="{self.firstname}", lastname="{self.lastname}")'


class Guest(User, JSONMixin):
    pass


class Admin(User, JSONMixin):
    pass


DATA = '{"firstname": "Jan", "lastname": "Twardowski"}'

guest = Guest.from_json(DATA)
admin = Admin.from_json(DATA)

type(guest)     # <class '__main__.Guest'>
print(guest)    # Guest(firstname="Jan", lastname="Twardowski")

type(admin)     # <class '__main__.Admin'>
print(admin)    # Admin(firstname="Jan", lastname="Twardowski")

5.4.3. Assignments

5.4.3.1. Protocol Classmethod CSV

English
  1. Use data from "Input" section (see below)

  2. Model class based on input data

  3. Create class CSVMixin with methods .to_csv() and .from_csv()

  4. Use @classmethod decorator

  5. Create instances for input data

  6. Dump instances data to CSV

  7. Restore intances from CSV

  8. Take care only about data, do not mind the header

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Zamodeluj klasę na podstawie danych wejściowych

  3. Stwórz klasę CSVMixin z metodami .to_csv() i .from_csv()

  4. Użyj dekoratora @classmethod

  5. Stwórz instancje obu klas wejściowych

  6. Zrzuć dane obu instancji do pliku CSV protocol-classmethod.csv

  7. Pierwszą linią ma być Astronaut Mark Watney

  8. Drugą linią ma być Cosmonaut Jan Twardowski

  9. Przywróć instancje z CSV

  10. Zatroszcz się tylko danymi, nie przejmuj się nagłówkiem

Input
FILE = r'protocol-classmethod.csv'

watney = Astronaut('Mark', 'Watney')
twardowski = Cosmonaut('Jan', 'Twardowski')

with open(FILE, mode='wt') as file:
    file.write(line1 + '\n')
    file.write(line2 + '\n')

del watney
del twardowski

result = []

with open(FILE, mode='rt') as file:
    line1 = file.readline().strip()
    line2 = file.readline().strip()
    ...
Output
from pprint import pprint

pprint(result)
# [Astronaut(firstname='Mark', lastname='Watney'),
#  Cosmonaut(firstname='Jan', lastname='Twardowski')]