Автор оригинала: 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/”