class <название_класса>:
<тело_класса>
class Car:
pass
<имя_объекта> = <имя_класса>()
car_object = Car()
class Phone:
pass
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
class Phone:
color = 'Grey'
def turn_on(self):
pass
def call(self):
pass
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'color', 'call', 'turn_on']
class Phone:
# Статические поля (переменные класса)
default_color = 'Grey'
default_model = ‘C385’
def turn_on(self):
pass
def call(self):
pass
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'call', 'default_color', 'default_model', 'turn_on']
>>> Phone.default_color
'Grey'
# Изменяем цвет телефона по умолчанию с серого на черный
>>> Phone.default_color = 'Black'
>>> Phone.default_color
'Black'
class Phone:
# Статические поля (переменные класса)
default_color = 'Grey'
default_model = 'C385'
def __init__(self, color, model):
# Динамические поля (переменные объекта)
self.color = color
self.model = model
# Создадим экземпляр класса Phone - телефон красного цвета модели 'I495’
>>> my_phone_red = Phone('Red', 'I495')
# Полный список атрибутов созданного экземпляра:
>>> dir(my_phone_red)
'__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'color', 'default_color', 'default_model', 'model']
# Прочитаем статические поля объекта
>>> my_phone_red.default_color
'Grey'
>>> my_phone_red.default_model
'C385'
# Прочитаем динамические поля объекта
>>> my_phone_red.color
'Red'
>>> my_phone_red.model
'I495'
# Создадим еще один экземпляр класса Phone - такой же телефон, но другого цвета
>>> my_phone_blue = Phone('Blue', 'I495')
# Прочитаем динамические поля объекта
>>> my_phone_blue.color
'Blue'
>>> my_phone_blue.model
'I495'
class Phone:
def __init__(self, color, model):
self.color = color
self.model = model
# Обычный метод
# Первый параметр метода - self
def check_sim(self, mobile_operator):
if self.model == 'I785' and mobile_operator == 'MTS':
print('Your mobile operator is MTS')
# Импортируем наш класс для работы с ним
>>> from phone import Phone
# Создаем экземпляр класса
>>> my_phone = Phone('red', 'I785')
# Обращаемся к методу check_sim() через объект my_phone
>>> my_phone.check_sim('MTS')
Your mobile operator is MTS
class Phone:
# Статический метод справочного характера
# Возвращает хэш по номеру модели
# self внутри метода отсутствует
@staticmethod
def model_hash(model):
if model == 'I785':
return 34565
elif model == 'K498':
return 45567
else:
return None
# Обычный метод
def check_sim(self, mobile_operator):
pass
>>> from phone import Phone
# Вызываем статический метод model_hash, просто обращаясь к имени класса
# Объект класса Phone при этом создавать не надо
>>> Phone.model_hash('I785')
34565
class Phone:
def __init__(self, color, model, os):
self.color = color
self.model = model
self.os = os
# Метод класса
# Принимает 1) ссылку на класс Phone и 2) цвет в качестве параметров
# Создает специфический объект класса Phone(особенность объекта в том, что это игрушечный телефон)
# При этом вызывается инициализатор класса Phone
# которому в качестве аргументов мы передаем цвет и модель,
# соответствующую созданию игрушечного телефона
@classmethod
def toy_phone(cls, color):
toy_phone = cls(color, 'ToyPhone', None)
return toy_phone
# Статический метод
@staticmethod
def model_hash(model):
pass
# Обычный метод
def check_sim(self, mobile_operator):
pass
>>> from phone import Phone
# Создаем объект игрушечный телефон
# Обращаемся к методу класса toy_phone через имя класса и точку
>>> my_toy_phone = Phone.toy_phone('Red')
>>> my_toy_phone
<phone.Phone object at 0x101a236d0>
class Phone:
def __init__(self, color):
# Объявляем публичное поле color
self.color = color
>>> from phone import Phone
# Создаем экземпляр класса Phone
>>> phone = Phone('Grey')
# Обращаемся к свойству color
>>> phone.color
'Grey'
# Изменяем свойство color
>>> phone.color = 'Red'
>>> phone.color
'Red'
class Phone:
def __init__(self, color):
# Объявляем защищенное поле _color
self._color = color
# Создаем экземпляр класса Phone
>>> phone = Phone('Grey')
# Обращаемся к защищенному свойству _color
>>> phone._color
'Grey'
# Изменяем защищенное свойство _color
>>> phone._color = 'Red'
>>> phone._color
'Red'
class Phone:
def __init__(self, color):
# Объявляем приватное поле __color
self.__color = color
>>> from phone import Phone
>>> phone = Phone('Grey')
# Пытаемся обратиться к приватному свойству и получаем ошибку
>>> phone.__color
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Phone' object has no attribute '__color'
# Получаем список атрибутов класса, в котором находим новое имя свойства: '_Phone__color'
>>> dir(phone)
['_Phone__color', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
# Обращаемся к защищенному свойству по новому имени
>>> phone._Phone__color
'Grey'
# Меняем значение защищенного свойства
>>> phone._Phone__color = 'Blue'
>>> phone._Phone__color
'Blue'
class <имя_нового_класса>(<имя_родителя>):
# Родительский класс
class Phone:
# Инициализатор
def __init__(self):
self.is_on = False
# Включаем телефон
def turn_on(self):
self.is_on = True
# Если телефон включен, делаем звонок
def call(self):
if self.is_on:
print('Making call...')
>>> my_phone = Phone()
>>> dir(my_phone)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'call', 'is_on', 'turn_on']
class Phone:
def __init__(self):
self.is_on = False
def turn_on(self):
self.is_on = True
def call(self):
if self.is_on:
print('Making call...')
# Унаследованный класс
class MobilePhone(Phone):
# Добавляем новое свойство battery
def __init__(self):
super().__init__()
self.battery = 0
# Заряжаем телефон на величину переданного значения
def charge(self, num):
self.battery = num
print(f'Charging battery up to ... {self.battery}%')
>>> my_mobile_phone = MobilePhone()
>>> dir(my_mobile_phone)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'battery', 'call', 'charge', 'is_on', 'turn_on']
# Импортируем оба класса
>>> from phone import Phone, MobilePhone
# Создаем объект класса MobilePhone
>>> my_mobile_phone = MobilePhone()
# Включаем телефон и делаем звонок
>>> my_mobile_phone.turn_on()
>>> my_mobile_phone.call()
Making call...
# Заряжаем мобильный телефон
>>> my_mobile_phone.charge(76)
Charging battery up to ... 76%
# Родительский класс
class Phone:
def __init__(self):
self.is_on = False
def turn_on(self):
pass
def call(self):
pass
# Метод, который выводит короткую сводку по классу Phone
def info(self):
print(f'Class name: {Phone.__name__}')
print(f'If phone is ON: {self.is_on}')
# Унаследованный класс
class MobilePhone(Phone):
def __init__(self):
super().__init__()
self.battery = 0
# Такой же метод, который выводит короткую сводку по классу MobilePhone
# Обратите внимание, что названия у методов совпадают - оба метода называются info()
# Однако их содержимое различается
def info(self):
print(f'Class name: {MobilePhone.__name__}')
print(f'If mobile phone is ON: {self.is_on}')
print(f'Battery level: {self.battery}')
# Демонстрационная функция
# Создаем список из классов
# В цикле перебираем список и для каждого элемента списка(а элемент - это класс)
# Создаем объект и вызываем метод info()
# Главная особенность: запись object.info() не дает информацию об объекте, для которого будет вызван метод info()
# Это может быть объект класса Phone, а может - объект класса MobilePhone
# И только в момент исполнения кода становится ясно, для какого именно объекта нужно вызывать метод info()
def show_polymorphism():
for item in [Phone, MobilePhone]:
print('-------')
object = item()
object.info()
>>> from phone import Phone, MobilePhone
>>> from phone import show_polymorphism
>>> show_polymorphism()
-------
Class name: Phone
If phone is ON: False
-------
Class name: MobilePhone
If mobile phone is ON: False
Battery level: 0