What is a clean, pythonic way to have multiple constructors in Python?

后端 未结 13 2368
醉梦人生
醉梦人生 2020-11-22 07:12

I can\'t find a definitive answer for this. As far as I know, you can\'t have multiple __init__ functions in a Python class. So how do I solve this problem?

13条回答
  •  情书的邮戳
    2020-11-22 07:20

    Since my initial answer was criticised on the basis that my special-purpose constructors did not call the (unique) default constructor, I post here a modified version that honours the wishes that all constructors shall call the default one:

    class Cheese:
        def __init__(self, *args, _initialiser="_default_init", **kwargs):
            """A multi-initialiser.
            """
            getattr(self, _initialiser)(*args, **kwargs)
    
        def _default_init(self, ...):
            """A user-friendly smart or general-purpose initialiser.
            """
            ...
    
        def _init_parmesan(self, ...):
            """A special initialiser for Parmesan cheese.
            """
            ...
    
        def _init_gouda(self, ...):
            """A special initialiser for Gouda cheese.
            """
            ...
    
        @classmethod
        def make_parmesan(cls, *args, **kwargs):
            return cls(*args, **kwargs, _initialiser="_init_parmesan")
    
        @classmethod
        def make_gouda(cls, *args, **kwargs):
            return cls(*args, **kwargs, _initialiser="_init_gouda")
    

提交回复
热议问题