11. Классы.

Общее понятие класса

class Simple(object):
    pass

simple_obj = Simple()

# field will be set only for that particular object
simple_obj.field = "some text"

print simple_obj.field
print isinstance(simple_obj, Simple)
print isinstance(simple_obj, object)
some text
True
True

Про определение класса

Классы как объекты

Поддерживают две основных операции:

  1. Обращение к аттрибуту класа - через точку по имени.
  2. Создание объекта класса - с помощью круглых скобок, как вызов функции.

Экземпляры классов

class Logger(object):
    def log(self, message):
        print "Imitating logger: ", message

logger = Logger()
logger.log("Starting operation")
print "Doing something"
logger.log("Ending operation")

Logger.log(logger, "Calling explicitly from class")
Imitating logger:  Starting operation
Doing something
Imitating logger:  Ending operation
Imitating logger:  Calling explicitly from class

Инициализация данных в классе

class Aggregator(object):
    def __init__(self):
        self.total_sum = 0
        self.elements_count = 0

    def add_value(self, value):
        self.total_sum += value
        self.elements_count += 1

    def get_average(self):
        return self.total_sum / self.elements_count

    def get_sum(self):
        return self.total_sum

Магические методы

Примеры: для арифметических операций (add, radd, iadd, mul, div …) etc.

Объект как словарь

Наследование

Одиночное наследование

class Parent(object):
    def __init__(self, surname="Doe"):
        self.surname = surname

    def __str__(self):
        return "Surname: {surname}".format(surname=self.surname)

class Child(Parent):
    def __init__(self, name, surname=None):
        if surname is not None:
            super(Child, self).__init__(surname=surname)
        else:
            super(Child, self).__init__()

        self.name = name

    def __str__(self):
        description = super(Child, self).__str__()
        return "Name: {name}, {suffix}".format(name=self.name, suffix=description)

boy = Child("John")
girl = Child("Jane")

print boy
print girl
Name: John, Surname: Doe
Name: Jane, Surname: Doe

Множественное наследование

class Mother(object):
    def hello(self):
        print "Hello from mother"

class Father(object):
    def hello(self):
        print "Hello from father"

class Child(Mother, Father):
    def hello(self):
        print "Hello from child"

child = Child()
child.hello()
print child.__class__.__mro__
Hello from child
(<class '__main__.Child'>, <class '__main__.Mother'>, <class '__main__.Father'>, <type 'object'>)

Приватные поля и методы

Name mangling