Multiple constructors in python, using inheritance

前端 未结 3 1783
走了就别回头了
走了就别回头了 2020-12-15 09:09

I have a class AbstractDataHandle, whith his init method, and a class Classifier. I would like to have two constructors in Classifier, Java like. One inheri

3条回答
  •  青春惊慌失措
    2020-12-15 09:57

    You can't have two constructors in one class.

    Constructors have to be named __init__. And, unlike Java, Python doesn't allow overloading functions or methods by the type of their arguments. So, if you had two constructors, they would both be the same function.

    There are a few ways around this.


    Use @classmethods as alternate constructors:

    class Breakfast(object):
        @classmethod
        def from_eggs(cls, eggs):
            obj = cls()
            obj.spam, obj.eggs = 5, eggs
            return obj
    
        @classmethod
        def from_spam_and_eggs(cls, spam, eggs):
            obj = cls()
            obj.spam, obj.eggs = spam, eggs
            return obj
    

    A simple example from the standard library is datetime.datetime, which can be constructed with now, fromtimestamp, or a few other alternate constructors, besides the default.


    Use default-valued, keyword-only, and/or variable-argument parameters to make a single constructor that can be called different ways:

    class Breakfast(object):
        def __init__(self, eggs=0, spam=5):
            self.spam, self.eggs = spam, eggs
    

    int is an example of this: You can create it from a string and a base, or from a single argument that knows how to convert itself to an integer.


    Create subclasses that each have different constructors:

    class Breakfast(object):
        pass
    
    class HealthyBreakfast(object):
        def __init__(self, spam):
            self.spam, self.eggs = spam, 0
    
    class NormalBreakfast(object):
        def __init__(self, spam, eggs):
            self.spam, self.eggs = spam, eggs
    

    In any of these cases, you can factor out commonalities into a single "base" initializer. For example:

    class Breakfast(object):
        def __init__(self, eggs, spam):
            self.spam, self.eggs = spam, eggs
    
    class HealthyBreakfast(object):
        def __init__(self, spam):
            super(HealthyBreakfast, self).__init__(0, spam)
    

    Of course in no case is it possible to have breakfast without spam.

提交回复
热议问题