python中的多个构造函数,使用继承

发布于 2021-01-29 17:16:07

我有一个AbstractDataHandle类,他的 init
方法和一个Classifier类。我想在Classifier中有两个类似Java的构造函数。其中一个继承自它的超类,另一个是全新的。

就像(但我打算“保留”这两个构造函数):

class AbstractDataHandle():
    def __init__(self, elements, attributes, labels):
        self._load(elements, attributes, labels)


class Classifier(AbstractDataHandle):
    def __init__(self, classifier="LinearSVC", proba=False):
        self._fit(classifier, proba)

我可以在一堂课中有两个构造函数吗?如果是,我可以从超类继承一个构造函数,并添加一个新的吗?

先感谢您。

关注者
0
被浏览
165
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    一个类中不能有两个构造函数。

    构造函数必须命名__init__。而且,与Java不同,Python不允许按参数类型重载函数或方法。因此,如果您有两个构造函数,则它们都将是同一函数。

    有几种解决方法。


    使用@classmethods作为备用构造函数:

    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
    

    从标准库一个简单的例子是datetime.datetime,可以用被构造nowfromtimestamp或一些其他的替代构造,除了默认


    使用默认值,仅关键字和/或变量参数的参数来制作一个可以以不同方式调用的构造函数:

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

    int
    例如:您可以从字符串和基数,或者从知道如何将自身转换为整数的单个参数创建它。


    创建每个具有不同构造函数的子类:

    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
    

    在上述任何一种情况下,都可以将通用性排除在单个“基本”初始值设定项中。例如:

    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)
    

    当然,在任何情况下都不可能在没有垃圾邮件的情况下享用早餐。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看