亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 python3.8+ 中自動化對象初始化

如何在 python3.8+ 中自動化對象初始化

慕斯709654 2022-07-12 10:21:50
情況我目前正在做一個小但非??蓴U展的項目,我有以下結構:/|- main.py|- services   |- __init__.py   |- service1.py    |- service2.py   |- ...這些服務中的每一個都創建一個對象,它們都具有完全相同的參數,并且它們都以相同的方式使用。他們之間的區別在于內部,他們做一些事情,對于這個不重要的問題,以不同的方式做事?,F在這是圍繞我的代碼當前如何處理它的方式:main.pyfrom services import *someObject = {} #content doesn't matter, it's always the sameserv_arr = []   # an array to hold all servicesserv_arr.append( service1.service1(someObject) ) serv_arr.append( service2.service2(someObject) )...for service in serv_arr:    # this function always has the same name and return type in each service    service.do_something()問題我的具體問題是:有沒有辦法通過serv_arr循環自動創建,這樣,如果我添加service100.py和service101.py到包中services,我不必返回main.py并手動添加它,而是自動加載它需要?
查看完整描述

2 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

好的,基于這個想法:


奧斯汀菲爾普的回答


# services/__init__.py


from .service1 import service1

from .service2 import service2

...


services = [service1, service2, ...]


__all__ = ['services']

在這個答案中提到的工廠模式中特別公開的方法和模塊的想法,我想出了一個非常hacky的解決方案,它不會使全局命名空間混亂(@Austin Philp 批評的另一件事)。


解決方案

我有了在每個模塊中實現一個方法的想法,該方法除了創建所述模塊的實例之外什么都不做,并且每個模塊都在以下內容中提到services/__init__.py:


#services/__init__.py

from .service1 import service1

from .service2 import service2


__all__=["service1", "service2", ...]

#services/service1.py

class service1(object):

    def __init__(self, input):

        ...

...

def create_instance(input):

    return service1(input) # create the object and return it. 

然后在 main.py 中,我只是這樣做(它非常hacky,但它有效)


#main.py

import services

import sys


# use the __all__ method to get module names. actually

for name in services.__all__:

    service = sys.modules[f'services.{name}'].create_instance( input )

    # do whatever with service

這樣我就可以愉快地做任何需要的事情,而不會弄亂全局命名空間,但仍然可以迭代甚至單獨調用模塊。要添加/刪除模塊,我唯一需要編輯的是__all__內部變量中的另一個條目services/__init__.py。它甚至消除了對serv_arr數組的需要,因為services.__all__已經有了我感興趣的所有名稱,并且與使用的模塊具有相同的長度。


查看完整回答
反對 回復 2022-07-12
?
catspeake

TA貢獻1111條經驗 獲得超0個贊

首先,您應該真正避免使用該from xxx import *模式,因為它會使全局命名空間變得混亂。


您可以將可用服務列表添加到services/__init__.py


像這樣的東西


# services/__init__.py

from .service1 import service1

from .service2 import service2

...


services = [service1, service2, ...]


__all__ = ['services']

如果這對您來說仍然過于手動,您可以遍歷目錄并使用importlib它們的路徑導入服務。


但是,我不禁認為這個問題表明設計不好。您可能需要考慮使用類似工廠模式的東西來實例化各種服務,而不是使用大量單獨的模塊。實際上,如果您想對所有服務進行小幅更改,那么您將面臨許多繁瑣的工作。


查看完整回答
反對 回復 2022-07-12
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號