Подтвердить что ты не робот

Python: Как создать подкласс из суперкласса?

В Python, как вы создаете подкласс из суперкласса?

4b9b3361

Ответ 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

Ответ 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())