В Python, как вы создаете подкласс из суперкласса?
Python: Как создать подкласс из суперкласса?
Ответ 1
Использование "супер" (см. Python Built-in, super) может быть немного лучшим методом вызова родителя для инициализации:
# Initialize using Parent
#
class MySubClass(MySuperClass):
def __init__(self):
MySuperClass.__init__(self)
# Better initialize using Parent (less redundant).
#
class MySubClassBetter(MySuperClass):
def __init__(self):
super(MySubClassBetter, self).__init__()
Ответ 2
Героический пример:
class SuperHero(object): #superclass, inherits from default object
def getName(self):
raise NotImplementedError #you want to override this on the child classes
class SuperMan(SuperHero): #subclass, inherits from SuperHero
def getName(self):
return "Clark Kent"
class SuperManII(SuperHero): #another subclass
def getName(self):
return "Clark Kent, Jr."
if __name__ == "__main__":
sm = SuperMan()
print sm.getName()
sm2 = SuperManII()
print sm2.getName()
Ответ 3
class MySubClass(MySuperClass):
def __init__(self):
MySuperClass.__init__(self)
# <the rest of your custom initialization code goes here>
раздел о наследовании в документации на python более подробно объясняет это
Ответ 4
class Class1(object):
pass
class Class2(Class1):
pass
Класс2 - это подкласс Class1
Ответ 5
Вы используете:
class DerivedClassName(BaseClassName):
Подробнее см. Документы Python, раздел 9.5.
Ответ 6
Существует еще один способ динамического создания подклассов в python с помощью функции type()
:
SubClass = type('SubClass', (BaseClass,), {'set_x': set_x}) # Methods can be set, including __init__()
Обычно вы используете этот метод при работе с метаклассами. Когда вы хотите сделать несколько более низких уровней автоматизации, это изменяет способ создания класса python. Скорее всего, вам никогда не понадобится делать это таким образом, но когда вы это сделаете, вы уже будете знать, что вы делаете.
Ответ 7
class Subclass (SuperClass):
# Subclass stuff here
Ответ 8
class Mammal(object):
#mammal stuff
class Dog(Mammal):
#doggie stuff
Ответ 9
Подкласс в Python выполняется следующим образом:
class WindowElement:
def print(self):
pass
class Button(WindowElement):
def print(self):
pass
Вот учебник о Python, который также содержит классы и подклассы.
Ответ 10
В приведенных выше ответах super
инициализируется без аргументов (ключевого слова). Часто, однако, вы хотели бы сделать это, а также передать некоторые собственные "собственные" аргументы. Вот пример, иллюстрирующий этот прецедент:
class SortedList(list):
def __init__(self, *args, reverse=False, **kwargs):
super().__init__(*args, **kwargs) # Initialize the super class
self.reverse = reverse
self.sort(reverse=self.reverse) # Do additional things with the custom keyword arguments
Это подкласс list
, который при инициализации немедленно сортирует себя в направлении, указанном аргументом ключевого слова reverse
, как показывают следующие тесты:
import pytest
def test_1():
assert SortedList([5, 2, 3]) == [2, 3, 5]
def test_2():
SortedList([5, 2, 3], reverse=True) == [5, 3, 2]
def test_3():
with pytest.raises(TypeError):
sorted_list = SortedList([5, 2, 3], True) # This doesn't work because 'reverse' must be passed as a keyword argument
if __name__ == "__main__":
pytest.main([__file__])
Благодаря передаче от *args
до super
список может быть инициализирован и заполнен элементами, а не только пустым. (Обратите внимание, что reverse
является аргументом только для ключевого слова в соответствии с PEP 3102).
Ответ 11
class BankAccount:
def __init__(self, balance=0):
self.balance = int(balance)
def checkBalance(self): ## Checking opening balance....
return self.balance
def deposit(self, deposit_amount=1000): ## takes in cash deposit amount and updates the balance accordingly.
self.deposit_amount = deposit_amount
self.balance += deposit_amount
return self.balance
def withdraw(self, withdraw_amount=500): ## takes in cash withdrawal amount and updates the balance accordingly
if self.balance < withdraw_amount: ## if amount is greater than balance return `"invalid transaction"`
return 'invalid transaction'
else:
self.balance -= withdraw_amount
return self.balance
class MinimumBalanceAccount(BankAccount): #subclass MinimumBalanceAccount of the BankAccount class
def __init__(self,balance=0, minimum_balance=500):
BankAccount.__init__(self, balance=0)
self.minimum_balance = minimum_balance
self.balance = balance - minimum_balance
#print "Subclass MinimumBalanceAccount of the BankAccount class created!"
def MinimumBalance(self):
return self.minimum_balance
c = BankAccount()
print(c.deposit(50))
print(c.withdraw(10))
b = MinimumBalanceAccount(100, 50)
print(b.deposit(50))
print(b.withdraw(10))
print(b.MinimumBalance())