Preventing a class from direct instantiation in Python

后端 未结 4 2058
春和景丽
春和景丽 2020-12-24 11:52

I have a super class with a method that calls other methods that are only defined in its sub classes. That\'s why, when I create an instance of my super class and call its m

4条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-24 12:35

    This is what I might do:

    class SuperClass(object):
        def __init__(self):
            if type(self) == SuperClass:
                raise Exception(" must be subclassed.")
            # assert(type(self) == SuperClass)
    
    class SubClass(SuperClass):
        def __init__(self):
            SuperClass.__init__(self)
    
    subC = SubClassOne()
    supC = SuperClass() # This line should throw an exception
    

    When run (exception is thrown!):

    [ 18:32 jon@hozbox ~/so/python ]$ ./preventing-direct-instantiation.py
    Traceback (most recent call last):
      File "./preventing-direct-instantiation.py", line 15, in 
        supC = SuperClass()
      File "./preventing-direct-instantiation.py", line 7, in __init__
        raise Exception(" must be subclassed.")
    Exception:  must be subclassed.
    

    Edit (from comments):

    [ 20:13 jon@hozbox ~/SO/python ]$ cat preventing-direct-instantiation.py 
    #!/usr/bin/python
    
    class SuperClass(object):
        def __init__(self):
            if type(self) == SuperClass:
                raise Exception(" must be subclassed.")
    
    class SubClassOne(SuperClass):
        def __init__(self):
            SuperClass.__init__(self)
    
    class SubSubClass(SubClassOne):
        def __init__(self):
            SubClassOne.__init__(self)
    
    class SubClassTwo(SubClassOne, SuperClass):
        def __init__(self):
            SubClassOne.__init__(self)
            SuperClass.__init__(self)
    
    subC = SubClassOne()
    
    try:
        supC = SuperClass()
    except Exception, e:
        print "FAILED: supC = SuperClass() - %s" % e
    else:
        print "SUCCESS: supC = SuperClass()"
    
    try:
        subSubC = SubSubClass()
    except Exception, e:
        print "FAILED: subSubC = SubSubClass() - %s" % e
    else:
        print "SUCCESS: subSubC = SubSubClass()"
    
    try:
        subC2 = SubClassTwo()
    except Exception, e:
        print "FAILED: subC2 = SubClassTwo() - %s" % e
    else:
        print "SUCCESS: subC2 = SubClassTwo()"
    

    Prints:

    [ 20:12 jon@hozbox ~/SO/python ]$ ./preventing-direct-instantiation.py 
    FAILED: supC = SuperClass() -  must be subclassed.
    SUCCESS: subSubC = SubSubClass()
    SUCCESS: subC2 = SubClassTwo()
    

提交回复
热议问题