Рубрики
Без рубрики

Пять типов наследования в Python

В предыдущей статье мы представили тему ориентированного объектно-ориентированного программирования или OOP для коротких. Затем мы обсудили классы и тему наследования. Эта статья сделает быстрый отвод наследования, то, что оно и почему вы его использовали. Тогда мы представим различные типы наследства, вы можете столкнуться с вашим программированием … Пять типов наследования в Python Подробнее »

Автор оригинала: David Yeoman.

В оформлении Предыдущая статья Мы представили тему объектно-ориентированного программирования или OOP для коротких. Тогда мы обсуждали классы и тема Наследование Отказ Эта статья сделает Быстрый отвод наследования , что это такое, и почему вы его использовали. Затем мы представим различные типы наследства, вы можете столкнуться с вашим программированием и проиллюстрировать их с примерами кода. Наконец, мы кратко коснусь в вложенном наследстве.

Что означает наследование?

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

Мы называем эту ассоциацию A Родительские отношения , где ребенок наследует атрибуты родителя. Тем не менее, это наследство может принимать разные формы. В реальном мире мы все знакомы с одним прямым наследством, где ребенок наследует от своего отца, который действительно является одной из форм, используемых в Python. Тем не менее, есть еще более сложные формы, которые мы сейчас обсудим.

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

Хотя пятый тип наследства по существу является амальгамой предыдущих четырех, есть пять основных форм. Я покажу каждый пример в блочной форме, а затем покажу в коде. Наконец, мы будем использовать пример продуктового магазина, чтобы объяснить типы.

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

Наиболее основная форма наследования, в этом случае ребенок наследует от одного родителя.

Давайте посмотрим на примере кода, в котором у нас есть класс продуктового магазина, содержащий общедоступные атрибуты продуктов продуктов, который является родительским, и детский класс консервированных элементов, которые имеют атрибуты, специально связанные с банками, такими как объем и производитель.

# Single Inheritance

class Stock:
    category = 'Groceries'

    def __init__(self, stock_code, description, buy_price, mark_up):
        self.code = stock_code
        self.desc = description
        self.buy = buy_price
        self.margin = mark_up

    def sell_price(self):
        print('Retail price = $', round(self.buy * self.margin, 2))

    def sale(self, discount):
        print('The discounted price of {} is $'.format(C298.desc),
              round(self.buy * self.margin * (1- discount), 2))

class Canned(Stock):
    category = 'Cans'

    def __init__(self, stock_code, description, buy_price, mark_up, volume, manuf):
       self.volume = volume
       self.manuf = manuf
       Stock.__init__(self, stock_code, description, buy_price, mark_up)

    def Label(self):
        print(self.desc, '\nVolume: ', self.volume)
        self.sell_price()

C298 = Canned('C298', 'Chicken Soup', 0.75, 1.553, '400 mls', 'Campbells')

C298.Label()

Вот результат этого фрагмента кода:

# Result

Chicken Soup 
Volume:  400 mls
Retail price = $ 1.16

В этом примере вы увидели простую связь одного наследования, где атрибуты, такие как фондовый кодекс, описание и т. Д., Принадлежность к родительскому классу под названием Accound, предоставляются для использования ребенка, называемой консервированными. Не только атрибуты доступны, поэтому также являются методами внутри родителя. Например, все дети консервированного класса могут получить доступ и использовать метод Sell_Price для родителя.

Многократное наследование

Несколько наследство возникают, когда есть два или более родительских классов, из которых унаследовать детский класс.

Мы расширим наш пример продуктового магазина, чтобы показать несколько наследний. В следующем коде у нас есть два родительских класса, наш оригинал Сток И другой под названием Склад Отказ Консервированный Класс – это ребенок обоих, наследство Сток Атрибуты и методы и Склад Атрибуты, такие как складское место, упаковка и количество на упаковку.

# Multiple Inheritance

class Stock:
    category = 'Groceries'

    def __init__(self, stock_code, description, buy_price, mark_up):
        self.code = stock_code
        self.desc = description
        self.buy = buy_price
        self.margin = mark_up

    def sell_price(self):
        print('Retail price = $', round(self.buy * self.margin, 2))

    def sale(self, discount):
        print('The discounted price of {} is $'.format(C298.desc),
              round(self.buy * self.margin * (1- discount), 2))

class Warehouse:
    category = 'Store'

    def __init__(self, location, pack_type, qty_per_pack):
        self.locn = location
        self.pack_type = pack_type
        self.pack_qty = qty_per_pack

class Canned(Stock, Warehouse):
    category = 'Cans'

    def __init__(self, stock_code, description, buy_price, mark_up, volume, manuf, location, pack_type, qty_per_pack):
        self.volume = volume
        self.manuf = manuf
        Stock.__init__(self, stock_code, description, buy_price, mark_up)
        Warehouse.__init__(self, location, pack_type, qty_per_pack)

    def stock_label(self):
        print('Stock Code: {} \nDescription: {} \nManufacturer: {} '
              '\nStock Locn: {} \nPacking: {} \nQty/Pack: {}'
              .format(self.code, self.desc, self.manuf, self.locn, self.pack_type, self.pack_qty))


C298 = Canned('C298', 'Chicken Soup', 0.75, 1.553, '400 mls', 'Campbells', 'Bay 24C', 'Carton', 48)

C298.stock_label()

Давайте посмотрим на результат:

# Result

Stock Code: C298 
Description: Chicken Soup 
Manufacturer: Campbells 
Stock Locn: Bay 24C 
Packing: Carton 
Qty/Pack: 48

Из кода вы можете увидеть, что когда мы напечатали этикетку на стойке, он содержал атрибуты, нарисованные с обоих родительских классов при использовании метода от детского класса.

Многоуровневое наследство

Мощность наследования – это способность к ребенку класс быть родительским классом другого. Таким образом, чтобы растянуть аналогию, у нас есть дедушка, родитель, дочерние отношения, которые описывают многоуровневое наследство.

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

# Multi-Level Inheritance

class Stock:
    category = 'Groceries'

    def __init__(self, stock_code, description, buy_price, mark_up):
        self.code = stock_code
        self.desc = description
        self.buy = buy_price
        self.margin = mark_up

    def sell_price(self):
        print('Retail price = $', round(self.buy * self.margin, 2))

    def sale(self, discount):
        print('The discounted price of {} is $'.format(C298.desc),
              round(self.buy * self.margin * (1 - discount), 2))

class Meat(Stock):
    category = 'Meat'

    def __init__(self, stock_code, description, buy_price, mark_up, weight, use_by):
        self.kilo = weight
        self.expiry = use_by
        Stock.__init__(self, stock_code, description, buy_price, mark_up)

    def Expiring(self, discount):
        print('Price reduced for quick sale: ${}'.format(round(self.buy * self.margin * (1 - discount), 2)))

    def Label(self):
        print(self.desc, '\nWeight: ', self.kilo, 'kgs', '\nExpiry: ', self.expiry)
        self.sell_price()

# C401 = Meat('C401', 'Sirloin Steak', 4.16, 1.654, .324, '15 June 2021')

class Chicken(Meat):
    category = 'Chicken'

    def __init__(self, stock_code, description, buy_price, mark_up, weight, use_by, portion, condition):
        self.cut = portion
        self.cond = condition
        Meat.__init__(self, stock_code, description, buy_price, mark_up, weight, use_by)

    def stock_label(self):
        print('Stock Code: {} \nDescription: {} \nPortion: {} '
              '\nCooked/Fresh/Frozen: {} \nWeight: {} kgs \nUse By: {}'
              .format(self.code, self.desc, self.cut, self.cond, self.kilo, self.expiry))

C793 = Chicken('C793', 'Chicken Pieces', 2.65, 1.756, 0.495, '28 July 2021', 'Drumsticks', 'Frozen' )

C793.stock_label()
print()
C793.sell_price()
print()
C793.Expiring(.20)

Результатом этого кода фрагмент выглядит следующим образом:

# Result

Stock Code: C793 
Description: Chicken Pieces 
Portion: Drumsticks 
Cooked/Fresh/Frozen: Frozen 
Weight: 0.495 kgs 
Use By: 28 July 2021

Retail price = $ 4.65

Price reduced for quick sale: $3.72

Курица Детский класс добавил два новых параметра, порцию и состояние. Параметр порции описывает барабанные палатки, бедра, грудь, четверть, половину и целое, в то время как состояние описывает замороженные, свежие или приготовленные. Мы передаем их в атрибуты self.cut и Self.Cond. . Мы получаем доступ к другим атрибутам из родителей, Мясо класс или бабушка, Сток класс. Мы также используем методы со всех трех уровней классов.

Иерархическое наследование

Иерархическое наследство напоминает классическую иерархическую структуру дерева организации. У него есть родитель с несколькими детьми.

При примере продуктового магазина различные категории продуктов – это все дети для родительского класса. Таким образом, у нас есть Консервированный С Мясо и Производить Классы, которые будут получать от родителей Сток Класс для общих атрибутов и методов. Тем не менее, каждый будет добавлять свои атрибуты и методы, специфичные для конкретных потребностей категории.

# Hierarchical Inheritance

class Stock:
    category = 'Groceries'

    def __init__(self, stock_code, description, buy_price, mark_up):
        self.code = stock_code
        self.desc = description
        self.buy = buy_price
        self.margin = mark_up

    def sell_price(self):
        print('Retail price = $', round(self.buy * self.margin, 2))

    def sale(self, discount):
        print('The discounted price of {} is $'.format(self.desc),
              round(self.buy * self.margin * (1 - discount), 2))


class Canned(Stock):
    category = 'Cans'

    def __init__(self, stock_code, description, buy_price, mark_up, volume, manuf):
        self.volume = volume
        self.manuf = manuf
        Stock.__init__(self, stock_code, description, buy_price, mark_up)


    def multi_buy(self):
        print('Buy two {} of {} {} {} and get one free. Pay only ${}'.format(self.category, self.manuf, \
                                                                             self.volume, self.desc, \
                                                                             round(self.buy * self.margin, 2)))

class Meat(Stock):
    category = 'Meat'

    def __init__(self, stock_code, description, buy_price, mark_up, weight, use_by):
        self.kilo = weight
        self.expiry = use_by
        Stock.__init__(self, stock_code, description, buy_price, mark_up)

    def Label(self):
        print(self.desc, '\nWeight: ', self.kilo, 'kgs', '\nExpiry: ', self.expiry)
        self.sell_price()

    def Expiring(self, discount):
        print('Price reduced for quick sale: ${}'.format(round(self.buy * self.margin * (1 - discount), 2)))

class Produce(Stock):
    category = 'Produce'

    def __init__(self, stock_code, description, buy_price, mark_up, category, unit):
        self.type = category
        self.unit = unit
        Stock.__init__(self, stock_code, description, buy_price, mark_up)

    def Label(self):
        print(self.desc, self.type, '\nPrice: $', (round(self.buy * self.margin, 2)), self.unit)


C401 = Meat('C401', 'Sirloin Steak', 4.16, 1.654, .324, '15 June 2021')

C298 = Canned('C298', 'Chicken Soup', 0.75, 1.553, '400 mls', 'Campbells')

C287 = Produce('C287', 'Golden Delicious', 0.25, 1.84, 'Apples', 'ea')

C401.Label()
print()
C401.Expiring(.35)
print()
C298.multi_buy()
print()
C298.sell_price()
print()
C287.Label()
print()
C287.sale(.15)

Результатом является:

# Result

Sirloin Steak 
Weight:  0.324 kgs 
Expiry:  15 June 2021
Retail price = $ 6.88

Price reduced for quick sale: $4.47

Buy two Cans of Campbells 400 mls Chicken Soup and get one free. Pay only $1.16

Retail price = $ 1.16

Golden Delicious Apples 
Price: $ 0.46 ea

The discounted price of Golden Delicious is $ 0.39

В этом коде мы назвали конкретные атрибуты и методы каждого класса ребенка, а также успешно вытягивая атрибуты и методы родителя.

Гибридное наследование

Как вы угадаете, гибридный наследство – это просто амальгама других видов наследства.

В нашем продуктовом магазине у нас есть универсальный фондовый класс и класс склада, который оба текут к классу мяса. Под классом мяса у нас есть курица, свинина и говядина. Как видите, тип наследования не имеет очевидного имени, отсюда, отсюда уловки – все гибрид.

# Hybrid Inheritance

class Stock: # Grandparent class
    category = 'Groceries'

    def __init__(self, stock_code, description, buy_price, mark_up):
        self.code = stock_code
        self.desc = description
        self.buy = buy_price
        self.margin = mark_up

    def sell_price(self):
        print('Retail price = $', round(self.buy * self.margin, 2))

class Warehouse: # Grandparent class
    category = 'Store'

    def __init__(self, location, pack_type, qty_per_pack):
        self.locn = location
        self.pack_type = pack_type
        self.pack_qty = qty_per_pack

class Meat(Stock, Warehouse): # Parent class
    category = 'Meat'

    def __init__(self, stock_code, description, buy_price, mark_up, location, pack_type, qty_per_pack, weight, use_by):
        self.kilo = weight
        self.expiry = use_by
        Stock.__init__(self, stock_code, description, buy_price, mark_up)
        Warehouse.__init__(self, location, pack_type, qty_per_pack)

    def Expiring(self, discount):
        print('Price reduced for quick sale: ${}'.format(round(self.buy * self.margin * (1 - discount), 2)))

    def Label(self):
        print(self.desc, '\nWeight: ', self.kilo, 'kgs', '\nExpiry: ', self.expiry, '\nLocation: ', self.locn, '\nPacking: ', self.pack_type)

class Chicken(Meat): # Child class #1
    category = 'Chicken'

    def __init__(self, stock_code, description, buy_price, mark_up, location, pack_type, qty_per_pack, weight, use_by, portion, condition):
        self.cut = portion
        self.cond = condition
        Meat.__init__(self, stock_code, description, buy_price, mark_up, location, pack_type, qty_per_pack, weight, use_by)

class Pork(Meat): # Child class #2
     category = 'Pork'

     def __init__(self, stock_code, description, buy_price, mark_up, location, pack_type, qty_per_pack, weight, use_by, portion, cooking):
         self.cut = portion
         self.cooking = cooking
         Meat.__init__(self, stock_code, description, buy_price, mark_up, location, pack_type, qty_per_pack, weight, use_by)

class Beef(Meat): # Child class #3 
    category = 'Beef'

    def __init__(self, stock_code, description, buy_price, mark_up, location, pack_type, qty_per_pack, weight, use_by, portion, cooking):
        self.cut = portion
        self.cooking = cooking
        Meat.__init__(self, stock_code, description, buy_price, mark_up, location, pack_type, qty_per_pack, weight, use_by)


C793 = Chicken('C793', 'Chicken Pieces', 2.65, 1.756,  'F23A', 'Bag',  8, 0.495, '28 July 2021', 'Drumsticks', 'Frozen')

C864 = Pork('C864', 'Pork', 6.45, 1.367, 'F87C', 'Shrinkwrap',  1, 1.423, '2 July 2021', 'Leg', 'Roast')

C496 = Beef('C496', 'Beef', 4.53, 1.4768,  'F64B', 'Styrofoam Wrap', 1, 0.327, '4 July 2021', 'Steak', 'Braising')

# Do calls on stock labels

C793.Label()
C793.sell_price()
print()
C864.Label()
C864.sell_price()
print()
C496.Label()
C496.sell_price()

Результат:

# Result

Chicken Pieces 
Weight:  0.495 kgs 
Expiry:  28 July 2021 
Location:  F23A 
Packing:  Bag
Retail price = $ 4.65

Pork 
Weight:  1.423 kgs 
Expiry:  2 July 2021 
Location:  F87C 
Packing:  Shrinkwrap
Retail price = $ 8.82

Beef 
Weight:  0.327 kgs 
Expiry:  4 July 2021 
Location:  F64B 
Packing:  Styrofoam Wrap
Retail price = $ 6.69

Как вы видели, три детских класса, Курица , Свинина и Говядина все удалось получить доступ к Этикетка Метод в родительском классе, который обращался к атрибутам в классах дедушек, чтобы определить расположение места расположения и атрибуты размещения, а затем напрямую доступ к Sell_price Метод в Сток класс.

Резюме

В этой статье мы пополнили наследство в Python, что это такое, и почему вы его использовали. Затем мы представили пять различных типов наследования, которые вы могли бы столкнуться с вашим программированием, прежде чем иллюстрировать их с примерами кода.

Спасибо за чтение, и я надеюсь, что вы нашли статью полезной.

Оригинал: “https://blog.finxter.com/understanding-inheritance-types-in-python/”