pycharm提示This inspection detects instance attribute definition outside __init__ method

示例代码:python

class MiNiCarStore(CarStore):

    def createCar(self, typeName):
        self.carFactory = CarFactory()  # 会出现下划线提示This inspection detects instance attribute definition outside __init__ method
        return self.carFactory.createCar(typeName)

缘由是:根据 SRP(Single Pesponsibility Principle, SRP) 原则,这个类原本就会承担某个界面逻辑,那么它就不该该再承担“初始化”的职责,初始化的工做应该在另外一个单独的类中完成,这样能让代码更可测(也就是更好写单元测试)数据库

可改写以下:缓存

class MiNiCarStore(CarStore):
	
	def __init__(self):
        self.carFactory = None
        
    def createCar(self, typeName):
        self.carFactory = CarFactory()
        return self.carFactory.createCar(typeName)

也能够在settings -> editor -> inspections -> python 取消勾选提示ide

扩展阅读单元测试

单一职责原则(Single Pesponsibility Principle, SRP)
单一职责有两个含义: 一个是避免相同的职责分散到不一样的类中, 别一个是避免一个类承担太多职责
为何要遵照SRP呢?测试

  • 能够减小类之间的耦合
    若是减小类之间的耦合,当需求变化时,只修改一个类,从而也就隔离了变化;若是一个类有多个不一样职责,它们耦合在一块儿,当一个职责发生变化时,可能会影响到其余职责。
  • 提升类的复用性 修改电脑比修理电视机简单多了。主要缘由就在于电视机各个部件之间的耦合性过高,而电脑则不一样,电脑的内存、硬盘、声卡、网卡、键盘灯等部件均可以很容易地单独拆卸和组装。某个部件坏了,换上新的便可。上面的例子就体现了单一职责的优点。因为使用了单一职责,使得‘组件’能够方便地‘拆卸’和‘组装’。 不遵照SRP会影响对类的复用性。当只须要用该类的某一个职责时,因为它和其余的职责耦合在一块儿,也就很难分离出。 遵照SRP在实际代码开发中有没有什么应用?有的。以数据持久层为例,所谓的数据持久层主要指的是数据库操做,固然,还包括缓存管理等。这时就须要数据持久层支持多种数据库。应该怎么作?定义多个数据库操做类?想法已经很接近了,再进一步,就是使用工厂模式。 工厂模式(Faction)容许你在代码执行时实例化对象。它之因此被称为工厂模式是由于它负责‘生产对象’。以数据库为例,工厂须要的就是根据不一样的参数,生成不一样的实例化对象。最简单的工厂就是根据传入的类型名实例化对象,如传入MySQL,就调用MySQL类并实例化,若是是SQLite,则调用 SQLite的类并实例化,甚至还能够处理TXT、Execl等‘类数据库’。
相关文章
相关标签/搜索