Рубрики

Понимание повторного использования кода и модульности в Python 3

Что такое объектно-ориентированное программирование (ООП)?

ООП — это парадигма программирования, основанная на концепции «объектов», которые могут содержать данные в форме полей, часто называемых атрибутами; и код в форме процедур, часто называемых методами. Узнайте больше здесь или просто Google «ООП».

Объекты имеют характеристики и особенности, известные как атрибуты, и могут делать различные вещи с помощью своих методов. Самая большая особенность ООП — это то, насколько хорошо объекты могут взаимодействовать и даже формоваться в будущем, что делает их очень удобными для разработчиков, масштабирует, меняет их с течением времени, тестирует и многое другое.

Что такое модульность?

Модульность относится к концепции создания множества модулей, а затем их объединения и объединения в единую систему (т. Е. Степень, в которой программное / веб-приложение может быть разделено на более мелкие модули, называется модульностью). Модульность обеспечивает возможность повторного использования и минимизирует дублирование.

Поток статьи

Цель: изучить объектно-ориентированное программирование — модульность. Как мы можем превратить некоторые части нашего кода в библиотеку, чтобы она могла быть использована кем-либо для дальнейшего использования. Создание модульного кода обеспечит возможность повторного использования и минимизирует дублирование.

Зависимости: pygame

Резюме: мы собираемся сделать маленькую игру (не совсем игру), а просто среду и некоторые объекты в ней. Мы попытаемся сделать среду статичной, а объекты (в нашем случае объекты BLOB-объектов) модульными. Мы будем использовать PyGame, поскольку он дает нам простой способ фактически визуализировать то, что мы делаем и строим, чтобы мы могли видеть наши объекты в действии. То, что мы собираемся сделать, это построить Blob World, который состоит из актеров, известных как blob. Разные BLOB-объекты имеют разные свойства, и в противном случае BLOB-объекты должны функционировать в своей среде Blob World. На этом примере мы сможем проиллюстрировать модульность.
Мы делим наш учебный процесс на две фазы.

  1. Создание окружающей среды и BLOB-объектов
  2. Понимание модульности

Репозиторий (Github): источник

BLOB WORLD (код Python)

import pygame

import random

  

STARTING_BLUE_BLOBS = 10

STARTING_RED_BLOBS = 3

  

WIDTH = 800

HEIGHT = 600

WHITE = (255, 255, 255)

BLUE = (0, 0, 255)

RED = (255, 0, 0)

  

game_display = pygame.display.set_mode((WIDTH, HEIGHT))

pygame.display.set_caption("Blob World")

clock = pygame.time.Clock()

  

class Blob:

  

    def __init__(self, color):

        self.x = random.randrange(0, WIDTH)

        self.y = random.randrange(0, HEIGHT)

        self.size = random.randrange(4,8)

        self.color = color

  

    def move(self):

        self.move_x = random.randrange(-1,2)

        self.move_y = random.randrange(-1,2)

        self.x += self.move_x

        self.y += self.move_y

  

        if self.x < 0: self.x = 0

        elif self.x > WIDTH: self.x = WIDTH

          

        if self.y < 0: self.y = 0

        elif self.y > HEIGHT: self.y = HEIGHT

  

  

def draw_environment(blob_list):

    game_display.fill(WHITE)

  

    for blob_dict in blob_list:

        for blob_id in blob_dict:

            blob = blob_dict[blob_id]

            pygame.draw.circle(game_display, blob.color, [blob.x, blob.y], blob.size)

            blob.move()

  

    pygame.display.update()

      

  

def main():

    blue_blobs = dict(enumerate([Blob(BLUE) for i in range(STARTING_BLUE_BLOBS)]))

    red_blobs = dict(enumerate([Blob(RED) for i in range(STARTING_RED_BLOBS)]))

    while True:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                pygame.quit()

                quit()

        draw_environment([blue_blobs,red_blobs])

        clock.tick(60)

  

if __name__ == '__main__':

    main()

Выход:


ЧАСТЬ (1/2): Мир Blob В этой части мы создаем простую игровую среду и некоторые объекты в ней, потому что визуализация того, что мы создали, является исключительным способом изучения программирования. Объяснение создания мира BLOB-объектов (т. Е. Его окружения и объектов) с использованием Pygame объясняется здесь . Все, что нам нужно понять, это как сделать наш код модульным.

ЧАСТЬ (2/2): Модульность В этой второй части мы собираемся понять существенную особенность объектно-ориентированного программирования, то есть модульность. Пока что мы не представили ничего, что сделало бы это ( код BLOB WORLD) слишком сложным для поддержки или масштабирования с течением времени, по крайней мере, в рамках того, что мы можем сделать с PyGame. Как насчет того, чтобы сделать его модульным? Для этого есть очень простой тест, давайте попробуем его импортировать!
Для этого у нас будет два файла. Давайте скопируем класс Blob и random и создадим новый файл: blob.py

import random

class Blob:

    def __init__(self, color):
        self.x = random.randrange(0, WIDTH)
        self.y = random.randrange(0, HEIGHT)
        self.size = random.randrange(4,8)
        self.color = color

    def move(self):
        self.move_x = random.randrange(-1,2)
        self.move_y = random.randrange(-1,2)
        self.x += self.move_x
        self.y += self.move_y

        if self.x  WIDTH: self.x = WIDTH
        
        if self.y  HEIGHT: self.y = HEIGHT

Вернемся к нашему исходному файлу, давайте удалим класс Blob, а затем импортируем Blob из blob.py.

import pygame
import random
from blob import Blob

STARTING_BLUE_BLOBS = 10
...

Сразу же мы получили сообщение об ошибке в файле blob.py относительно нашего класса Blob, где у нас есть несколько неопределенных переменных. Это определенно проблема с написанием классов, мы должны стараться избегать использования констант или переменных вне класса. Давайте добавим эти значения в метод __init__, а затем изменим все части, где мы использовали константы.
Итак, вот наш новый файл класса Blob: blob.py
Далее, в нашем исходном файле, когда мы вызываем класс Blob, он ожидает некоторые значения для этих аргументов, поэтому вы добавите их в основную функцию:

def main():
    blue_blobs = dict(enumerate([Blob(BLUE,WIDTH,HEIGHT) for i in range(STARTING_BLUE_BLOBS)]))
    red_blobs = dict(enumerate([Blob(RED,WIDTH,HEIGHT) for i in range(STARTING_RED_BLOBS)]))
    while True:
        ...

Отлично, теперь наш класс Blob можно по крайней мере импортировать, так что он уже модульный! Другая хорошая идея — попытаться дать разработчику, использующему ваш код, как можно больше возможностей, и сделать ваш класс максимально обобщенным. По крайней мере, один пример, где мы можем определенно дать больше программисту, использующему этот класс, находится в определении размера BLOB-объекта:

  self.size = random.randrange(4,8) 

Есть ли какая-то причина, по которой мы не хотели бы дать программисту простой способ изменить это? Я так не думаю. Однако, в отличие от x_boundary и y_boundary, нам не обязательно * нужен * программист для предоставления нам значения размера, так как мы можем по крайней мере использовать разумное начальное значение по умолчанию. Таким образом, мы можем сделать что-то вроде:

class Blob:

    def __init__(self, color, x_boundary, y_boundary, size_range=(4,8)):
        self.x_boundary = x_boundary
        self.y_boundary = y_boundary
        self.x = random.randrange(0, self.x_boundary)
        self.y = random.randrange(0, self.y_boundary)
        self.size = random.randrange(size_range[0],size_range[1])
        self.color = color

Теперь, если программист хочет изменить размер, он может, в противном случае он не должен. Мы также можем позволить программисту изменить скорость большого двоичного объекта, если они хотят:

import random


class Blob:

    def __init__(self, color, x_boundary, y_boundary, size_range=(4,8), movement_range=(-1,2)):
        self.size = random.randrange(size_range[0],size_range[1])
        self.color = color
        self.x_boundary = x_boundary
        self.y_boundary = y_boundary
        self.x = random.randrange(0, self.x_boundary)
        self.y = random.randrange(0, self.y_boundary)
        self.movement_range = movement_range

    def move(self):
        self.move_x = random.randrange(self.movement_range[0],self.movement_range[1])
        self.move_y = random.randrange(self.movement_range[0],self.movement_range[1])
        self.x += self.move_x
        self.y += self.move_y

        if self.x  self.x_boundary: self.x = self.x_boundary
        
        if self.y  self.y_boundary: self.y = self.y_boundary

Теперь мы немного открыли класс. Что-нибудь еще выскакивает у нас? Да, линия, где мы заставляем BLOB-объект оставаться в границах. Могут ли быть примеры, когда мы хотели бы, чтобы капли могли свободно перемещаться вне поля зрения? Конечно! Полезен ли этот ограничительный код? Возможно ли, что программисты захотят использовать это довольно часто? Конечно! тем не менее, имеет смысл либо вообще не иметь код, либо предоставить ему собственный метод, например так:

import random

class Blob:

    def __init__(self, color, x_boundary, y_boundary, size_range=(4,8), movement_range=(-1,2)):
        self.size = random.randrange(size_range[0],size_range[1])
        self.color = color
        self.x_boundary = x_boundary
        self.y_boundary = y_boundary
        self.x = random.randrange(0, self.x_boundary)
        self.y = random.randrange(0, self.y_boundary)
        self.movement_range = movement_range

    def move(self):
        self.move_x = random.randrange(self.movement_range[0],self.movement_range[1])
        self.move_y = random.randrange(self.movement_range[0],self.movement_range[1])
        self.x += self.move_x
        self.y += self.move_y

    def check_bounds(self):
        if self.x  self.x_boundary: self.x = self.x_boundary
        
        if self.y  self.y_boundary: self.y = self.y_boundary

Теперь программист может решить, использовать его или нет. Вы также можете привести некоторый аргумент в методе move, где, если True, тогда границы будут применены.
Таким образом, мы получили представление о том, как мы можем сделать наш код Python модульным.

Ресурсы:

Эта статья предоставлена Amartya Ranjan Saikia . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Понимание повторного использования кода и модульности в Python 3

0.00 (0%) 0 votes