Python 3继承AttributeError。怎么解决?

时间:2017-12-09 19:10:49

标签: python python-3.x inheritance attributeerror

我已经阅读了很多关于Python继承的内容,但我无法理解如何以正确的方式使用它。我了解了继承如何使用Java,所以我想这就是为什么我有点困惑。

这是我的超级班:

.travis.yml

正如您所看到的,我有一个很大的 init ,我想在我的子类中继承它。我还有一个抽象的方法在子类中实现。

这是我的子类的代码:

class MongoData:
    def __init__(self, db_name, coll_name):
        self.__config = configparser.ConfigParser()
        self.__config.read('conf.ini')
        self.__connect = self.__config.get('mongo', 'connect')
        self.__client = MongoClient(self.__connect)
        self.__db_name = db_name
        self.__coll_name = coll_name
        self.__db = None
        self.__coll = None

        if self.__db_name in self.__client.database_names(): # If DB already exists
            print('DB exist')
            self.__db = self.__client[self.__db_name]
            if self.__coll_name in self.__db.collection_names(): # If collection already exists
                print('Collection exists')
                self.__coll = self.__db[self.__coll_name]

            else: # If collection does not exist, create it
                self.__db = self.__db_name
                self.__coll = self.__db[self.__coll_name]
                print(self.__db.collection_names())

        else: # If DB does not exist, create it
            print('Creating database...')
            self.__db = self.__client[self.__db_name]
            self.__coll = self.__db[self.__coll_name]
            #print(self.__db.collection_names())
            print("Database {} and collection {} successfully created.".format(self.__db_name, self.__coll_name))

    def writeDB(self, wdict):
        """Method to implement"""
        raise NotImplementedError

正如我所想,我得到了一个AttributeError

  

AttributeError:' AttackDB'对象没有属性' _AttackDB__coll'

我的问题是,我该怎么做才能重写漏洞 init

谢谢。

编辑: 在返回class AttackDB(MongoData): __metaclass__ = abc.ABCMeta def __init__(self, db_name, coll_name): MongoData.__init__(self, db_name, coll_name) @abc.abstractmethod def writeDB(self, wdict): doc_id = self.__coll.insert_one(attack).inserted_id print("Attack with id {} was inserted in the DB.".format(dic_id)) self.__db的超级班中怎么样?它适用于我,但我不确定它是否是一个好的"溶液

1 个答案:

答案 0 :(得分:1)

欢迎使用Python,Elena!

正如您已经注意到的,Python在处理继承方面与其他语言略有不同。你发现的是因为python的性质而被称为name mangling

所以如果你写:

class MongoData:
    def __init__(self, db_name, coll_name):
        self.__config = configparser.ConfigParser()

你在孩子身上得到的是变量叫做_MongoData__config,而不是self.__config(记得_AttackDB__coll吗?)这可能会让你感到困惑,但是你会更好地理解Python的工作原理终于开始有意义了。

一种语言的最佳实践并不总是适用于其他语言,因此这里的建议要么使用不同的命名,要么使用组合而不是继承。即使Mixin模式在某种程度上也可能是危险的。

希望能回答你的问题。