Python:如何从超类创建子类?

dav*_*ott 80 python class

在Python中,如何从超类中创建子类?

小智 84

# Initialize using Parent
#
class MySubClass(MySuperClass):
    def __init__(self):
        MySuperClass.__init__(self)
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,使用Python的内置函数super()(参见Python 2/Python 3文档)可能是一种稍微好一点的调用父进行初始化的方法:

# Better initialize using Parent (less redundant).
#
class MySubClassBetter(MySuperClass):
    def __init__(self):
        super(MySubClassBetter, self).__init__()
Run Code Online (Sandbox Code Playgroud)

或者,与上面完全相同,除了使用零参数形式super(),它只适用于类定义:

class MySubClassBetter(MySuperClass):
    def __init__(self):
        super().__init__()
Run Code Online (Sandbox Code Playgroud)

  • OTOH,有些人警告"超级",特别是新的Python程序员(例如,Lutz).我避免它. (6认同)
  • 避免使用`super`的唯一理由是,如果你不理解`super`在Python中如何工作,以及`super` /`parent`如何在其他语言中工作.不可否认,这对于来自其他语言的人来说并不明显,但我不认为这可以将其视为"谨慎对待".它*确实*有效.它的工作方式不同.在你抱怨获得你没想到的结果之前,先阅读它在Python中的实际功能. (5认同)
  • [这是调用超类函数的两种方法之间的区别](/sf/ask/1514785191/) (5认同)
  • 两者有什么区别? (2认同)

ewa*_*all 61

一个英雄的小例子:

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()
Run Code Online (Sandbox Code Playgroud)


Bry*_*ley 37

class MySubClass(MySuperClass):
    def __init__(self):
        MySuperClass.__init__(self)

        # <the rest of your custom initialization code goes here>
Run Code Online (Sandbox Code Playgroud)

python文档中有关继承部分更详细地解释了它

  • 如果想要为其添加更多代码,您只需要定义`__init__`方法,否则无论如何都会使用原始的init方法(虽然它值得一提,并且是完全有效的代码) (5认同)
  • 我认为这个问题很模糊,可以假设可能会增加更多代码.更好的提供太多的信息而不是足够的,并在OP实现它时结束另一个问题.:) (2认同)

wor*_*ad3 15

class Class1(object):
    pass

class Class2(Class1):
    pass
Run Code Online (Sandbox Code Playgroud)

Class2是Class1的子类


Kur*_*eek 8

在上面的答案中,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
Run Code Online (Sandbox Code Playgroud)

这是一个子类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__])
Run Code Online (Sandbox Code Playgroud)

感谢传递*argssuper,列表可以初始化并填充项目而不是仅为空.(注意,这reverse是根据PEP 3102的仅关键字参数).


Wer*_*sey 3

class Subclass (SuperClass):
      # Subclass stuff here
Run Code Online (Sandbox Code Playgroud)