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


示例代碼:

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 取消勾選提示

擴展閱讀

單一職責原則(Single Pesponsibility Principle, SRP)
單一職責有兩個含義: 一個是避免相同的職責分散到不同的類中, 別一個是避免一個類承擔太多職責
為什么要遵守SRP呢?

  • 可以減少類之間的耦合
    如果減少類之間的耦合,當需求變化時,只修改一個類,從而也就隔離了變化;如果一個類有多個不同職責,它們耦合在一起,當一個職責發生變化時,可能會影響到其他職責。
  • 提高類的復用性
    修改電腦比修理電視機簡單多了。主要原因就在於電視機各個部件之間的耦合性太高,而電腦則不同,電腦的內存、硬盤、聲卡、網卡、鍵盤燈等部件都可以很容易地單獨拆卸和組裝。某個部件壞了,換上新的即可。上面的例子就體現了單一職責的優勢。由於使用了單一職責,使得‘組件’可以方便地‘拆卸’和‘組裝’。
    不遵守SRP會影響對類的復用性。當只需要用該類的某一個職責時,由於它和其他的職責耦合在一起,也就很難分離出。
    遵守SRP在實際代碼開發中有沒有什么應用?有的。以數據持久層為例,所謂的數據持久層主要指的是數據庫操作,當然,還包括緩存管理等。這時就需要數據持久層支持多種數據庫。應該怎么做?定義多個數據庫操作類?想法已經很接近了,再進一步,就是使用工廠模式。
    工廠模式(Faction)允許你在代碼執行時實例化對象。它之所以被稱為工廠模式是因為它負責‘生產對象’。以數據庫為例,工廠需要的就是根據不同的參數,生成不同的實例化對象。最簡單的工廠就是根據傳入的類型名實例化對象,如傳入MySQL,就調用MySQL類並實例化,如果是SQLite,則調用 SQLite的類並實例化,甚至還可以處理TXT、Execl等‘類數據庫’。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM