- Что было до ООП
- Класс
- Объект
- Объект
- Метод
- Атрибут
- Атрибут класса
- self
- self
- Инициализация
- Инициализация
- @dataclass
- @dataclass
- @dataclass
- Наследование
- Наследование по-простому
- super
- super
- Полиморфизм
- Инкапсуляция
- Инкапсуляция
- Инкапсуляция
- setter / getter
- setter/getter
- Статические методы
- Статические методы
- В Python всё есть объект
- Дополнительная литература
- Вопросы-ответы
Код был императивным, то есть команды построчно выполнялись
counter = 0
while counter <= 3:
counter += 1
print(f"Step {counter}")
counter = 0
result = 0
while counter <= 3:
result += counter
counter += 1
class Animal(object):
...
class Cat(Animal):
...
a_cat = Cat(type="египетский")
a_cat = Cat(type="кроличий")
class Cat(Animal):
...
def sleep(self, period):
self.activity = None
time.sleep(period)
class Cat(Animal):
tail_state = 'puffed up'
...
Так мы говорим, что у всех кошек на Земле хвост задран
class Cat(Animal):
tail_state = 'puffed up'
...
А так только у какой-то конкретной кошки (у конкретного экземпляра объекта класса Cat)
class Cat(Animal):
def __init__(self):
self.tail_state = 'puffed up'
...
- self: это указать на конкретный экземпляр объекта класса.
class Cat(Animal):
def meow(self):
print('Meow')
cat_1 = Cat()
cat_2 = Cat()
cat_3 = Cat()
cat_1.meow()
# Кто сказал "мяу"?
class Cat(Animal):
def __init__(self,
age,
breed,
color_schema,
tail_state,
is_domestic=False,
family=None):
self.age = age
self.breed = breed
self.color_schema = color_schema
self.tail_state = tail_state,
self.is_domestic = is_domestic
self.family = family
def take_cat(self, family):
if self.is_domestic:
raise Exception(
'Это домашняя кошка!'
' Её нельзя забрать!'
)
self.is_domestic = True
self.family = family
from dataclasses import dataclass
@dataclass
class Cat(Animal):
age: int
breed: str
color_schema: int
tail_state: int
is_domestic: bool = False
family: object = None
class Cat(Animal):
def __init__(
self, age: int, breed: str,
color_schema: int, tail_state: int,
is_domestic: bool=False,
family: object=None
):
self.age = age
self.breed = breed
self.color_schema = color_schema
self.tail_state = tail_state,
self.is_domestic = is_domestic
self.family = family
@dataclasses.dataclass(
*, init=True, repr=True, eq=True,
order=False, unsafe_hash=False,
frozen=False
)
class Animal:
def say(self):
raise NotImplementedError()
class Cat(Animal):
def say(self):
print('meow!')
class Dog(Animal):
def barking(self):
# что произойдёт?
return self.say()
Наследование это всего лишь порядок, по которому будет идти поиск атрибутов и методов.
# class A(object):
class A:
attr = 10
def method(self):
print("method")
class B(A):
attr = 20
def function(self):
print("function")
class B(A):
def function(self):
super().method()
(
self.__class__
.__bases__[0]
.method(self)
)
print("function")
b = B()
b.function()
method
method
function
def listen_to_animal(animal: Animal):
animal.say()
a_cat = Cat()
a_dog = Dog()
listen_to_animal(a_cat)
listen_to_animal(a_dog)
- переменные и методы с одним подчёркиванием _name программисты договорились считать внутренними переменными
- переменные и методы с двойным подчёркиванием _ _name Python прячет особым образом (но к ним всё ещё можно получить доступ)
class A:
x = 10
_y = 20
__z = 30
a = A()
print(a.x) # -> 10
print(a._y) # -> 20
print(a.__z) # -> ???
a = A()
print(a.x) # -> 10
print(a._y) # -> 20
try:
a.__z # -> ERROR!
except AttributeError as e:
print(e)
print(a._A__z)
a._A__z = 0
print(a._A__z)
class A:
x = 10
_y = 20
__z = 30
@property
def z(self):
return self.__z
@z.setter
def z(self, value):
if value < 0:
raise ValueError(f"{val}<0")
self.__z = value
return value
a = A()
print(a.x) # -> 10
print(a._y) # -> 20
print(a.z) # -> ???
a.z = 0
print(a.z) # -> ???
Не требуют указания текущего объекта вызова
class Cat:
@staticmethod
def say():
print("meow")
class AnotherCat:
pass
def say():
print("meow")
AnotherCat.say = staticmethod(say)
cat_1 = Cat()
cat_2 = AnotherCat()
cat_1.say()
cat_2.say()
a = 10
print(a.bit_length())
def func(x, y):
return x + y
f = func
print(f.__name__)
4
func
- Object Oriented Programming in Python
- Основы ООП. Классы, объекты, методы
- wikibook
- Марк Лутц. «Изучаем Python»