Python: Как мне сделать подкласс из суперкласса? - PullRequest
78 голосов
/ 22 октября 2009

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

Ответы [ 11 ]

80 голосов
/ 22 октября 2009
# Initialize using Parent
#
class MySubClass(MySuperClass):
    def __init__(self):
        MySuperClass.__init__(self)

Или, что еще лучше, использование встроенной функции Python, super() (см. Документацию по Python 2 / Python 3 ) может быть немного лучше вызова родителя для инициализации:

# Better initialize using Parent (less redundant).
#
class MySubClassBetter(MySuperClass):
    def __init__(self):
        super(MySubClassBetter, self).__init__()

Или то же самое, что и выше, за исключением использования формы аргумента с нулевым аргументом super(), которая работает только внутри определения класса:

class MySubClassBetter(MySuperClass):
    def __init__(self):
        super().__init__()
61 голосов
/ 22 октября 2009

Героический маленький пример:

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()
36 голосов
/ 22 октября 2009
class MySubClass(MySuperClass):
    def __init__(self):
        MySuperClass.__init__(self)

        # <the rest of your custom initialization code goes here>

Раздел о наследовании в документации по python объясняет это более подробно

14 голосов
/ 22 октября 2009
class Class1(object):
    pass

class Class2(Class1):
    pass

Class2 является подклассом Class1

6 голосов
/ 21 ноября 2017

В приведенных выше ответах 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 ).

4 голосов
/ 17 сентября 2014

Существует еще один способ динамического создания подклассов в python с помощью функции type():

SubClass = type('SubClass', (BaseClass,), {'set_x': set_x})  # Methods can be set, including __init__()

Обычно вы хотите использовать этот метод при работе с метаклассами. Если вы хотите сделать некоторые более низкие уровни автоматизации, это изменяет способ, которым Python создает класс. Скорее всего, вам никогда не потребуется делать это таким образом, но когда вы это сделаете, вы уже будете знать, что делаете.

3 голосов
/ 22 октября 2009

Вы используете:

class DerivedClassName(BaseClassName):

Подробнее см. В документации Python, раздел 9.5 .

3 голосов
/ 22 октября 2009
class Subclass (SuperClass):
      # Subclass stuff here
2 голосов
/ 22 октября 2009
class Mammal(object): 
#mammal stuff

class Dog(Mammal): 
#doggie stuff
1 голос
/ 06 июля 2016
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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...