最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?動態(tài)創(chuàng)建一個類的示例代碼

 更新時間:2025年06月19日 08:47:52   作者:JHC000000  
這篇文章主要介紹了Python?動態(tài)創(chuàng)建一個類的示例代碼,通過實(shí)例代碼補(bǔ)充介紹了python動態(tài)實(shí)例化的相關(guān)知識,需要的朋友可以參考下

Python 動態(tài)創(chuàng)建一個類的示例代碼:

# 動態(tài)創(chuàng)建類
# class_body 里是類里邊的函數(shù),可以寫在文件里,從文件中讀取
class_body = """
def running_function(self):
    print(self.name)
    print("running function")
def set_name(self,name):
    self.name = name
"""
class_dict = {}
# 加載類方法到class_dict里
exec(class_body,globals(),class_dict)
# 把class_dict中的方法加載到類里邊
Customer = type("Customer",(object,),class_dict)
# 實(shí)例化類,調(diào)用類方法
c = Customer()
c.set_name("12")
c.running_function()

補(bǔ)充:python動態(tài)實(shí)例化

python動態(tài)實(shí)例化

前言

最近在查一個服務(wù)的問題時,看到有一段代碼if .. elif ... 寫了近百行,類似

if command == "xxx":
	obj = CommandX()
	obj.run()
	# ...
elif command == "yyy":
	obj = CommandY()
	obj.run()
    # ...
elif command == "zzz":
	obj = CommandZ()
	obj.run()
    # ...
# ...

翻了下git記錄,最開始其實(shí)只有兩三個條件判斷,后來command越加越多,就這么延續(xù)下來了。

代碼邏輯其實(shí)沒什么問題,也很簡單明了,就是看起來有點(diǎn)丑,而且我還開了比較高的桌面縮放,導(dǎo)致一屏幕幾乎都是這段if ... elif

看來看去越發(fā)覺得丑,先寫個demo看看能不能跑通代碼。

方式1, 字典映射

如果需要判斷的條件比較少,用字典做映射還是挺方便的,但如果條件多,看起來還是挺丑的。

from abc import ABC, abstractmethod
class AbstractCommand(ABC):
    @abstractmethod
    def run(self):
        pass
class CommandA(AbstractCommand):
    def run(self):
        return "this is command A"
class CommandB(AbstractCommand):
    def run(self):
        return "this is command B"
class CommandC(AbstractCommand):
    def run(self):
        return "this is command C"
class CommandFactory:
    @staticmethod
    def create_command(command_type: str) -> AbstractCommand:
        command_mapping = {
            "cmda": CommandA,
            "cmdb": CommandB,
            "cmdc": CommandC
        }
        cls = command_mapping.get(command_type.lower())
        if not cls:
            raise ValueError(f"Unknown command type: {command_type}")
        return cls()
if __name__ == "__main__":
    cmd = CommandFactory.create_command("cmda")
    assert cmd.run() == "this is command A"
    cmd = CommandFactory.create_command("cmdb")
    assert cmd.run() == "this is command B"
    cmd = CommandFactory.create_command("cmdc")
    assert cmd.run() == "this is command CD"  # should be exception
    cmd = CommandFactory.create_command("cmdd")  # should be exception
    assert cmd.run() == "this is command D"

方式2, __init_subclass__

《流暢的Python(第2版)》的最后一章提到了這個__init__subclass__,根據(jù)python官方文檔:

當(dāng)所在類派生子類時此方法就會被調(diào)用。cls 將指向新的子類。如果定義為一個普通實(shí)例方法,此方法將被隱式地轉(zhuǎn)換為類方法。傳給一個新類的關(guān)鍵字參數(shù)會被傳給上級類的 __init_subclass__。 為了與其他使用 __init_subclass__ 的類兼容,應(yīng)當(dāng)去掉需要的關(guān)鍵字參數(shù)再將其他參數(shù)傳給基類。

借助這個機(jī)制,可以在實(shí)現(xiàn)抽象基類時自動注冊子類,避免手動維護(hù)注冊表。

from abc import ABCMeta, abstractmethod
from threading import Lock
from collections import UserDict
class ThreadSafeDict(UserDict):
    """線程安全的字典"""
    def __init__(self):
        super().__init__()
        self._lock = Lock()
    def __setitem__(self, key, item):
        with self._lock:
            super().__setitem__(key, item)
class Command(metaclass=ABCMeta):
    registry = ThreadSafeDict()
    def __init__(self):
        pass
    @abstractmethod
    def run(self):
        pass
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.registry[cls.__name__.lower()] = cls  # 自動注冊子類
# 子類定義即自動注冊
class CommandA(Command):
    def run(self):
        return "this is command a!"
class CommandB(Command):
    def run(self):
        return "this is command b!"
class CommandC(Command):
    def run(self):
        return "this is command b!"
def create_command(command_type: str) -> Command:
    """工廠函數(shù)"""
    cls = Command.registry.get(command_type.lower())
    if not cls:
        raise ValueError(f"Unknown command type: {command_type}")
    return cls()
if __name__ == "__main__":
    cmd = create_command("CommandA")
    assert cmd.run() == "this is command a!"
    cmd = create_command("CommandB")
    assert cmd.run() == "this is command b!"
    cmd = create_command("CommandC")
    assert cmd.run() == "this is command cc!"  # should be exception
    cmd = create_command("CommandD")
    assert cmd.run() == "this is command b!"  # should be exception

乍一看還是挺不錯的,但是也有個缺點(diǎn),那就是如果各個類分散在不同模塊中,那么工廠函數(shù)所在的模塊就要寫一堆from xxx import ...

如果module和類命名比較規(guī)范,也可以這么動態(tài)加載類

import importlib
def create_class(module_name, class_name):
    module = importlib.import_module(module_name)
    cls = getattr(module, class_name)
    return cls()

補(bǔ)充

自動注冊類看起來炫,但是對代碼閱讀來說不是很直觀。易讀還是美觀?這是一個問題。

到此這篇關(guān)于Python 動態(tài)創(chuàng)建一個類的文章就介紹到這了,更多相關(guān)Python 動態(tài)創(chuàng)建一個類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python?解釋器的站點(diǎn)配置和模塊搜索路徑詳解

    Python?解釋器的站點(diǎn)配置和模塊搜索路徑詳解

    Python?解釋器的站點(diǎn)配置是指一組配置和路徑設(shè)置,用于支持特定于站點(diǎn)的定制和擴(kuò)展,這些配置和路徑信息由?Python?的內(nèi)置?site?模塊提供,這篇文章主要介紹了Python?解釋器的站點(diǎn)配置和模塊搜索路徑詳解,需要的朋友可以參考下
    2022-01-01
  • Python中優(yōu)化堆積條形圖的實(shí)現(xiàn)方法與對比效果

    Python中優(yōu)化堆積條形圖的實(shí)現(xiàn)方法與對比效果

    在數(shù)據(jù)可視化中,堆積條形圖 擅長展示 整體與構(gòu)成 的關(guān)系,今天,本文將嘗試探索一下改進(jìn)堆積條形圖的呈現(xiàn)方式,讓復(fù)雜數(shù)據(jù)對比變得一目了然,感興趣的小伙伴可以了解下
    2026-01-01
  • 對python 調(diào)用類屬性的方法詳解

    對python 調(diào)用類屬性的方法詳解

    今天小編就為大家分享一篇對python 調(diào)用類屬性的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python量化因子測算與繪圖超詳細(xì)流程代碼

    Python量化因子測算與繪圖超詳細(xì)流程代碼

    這篇文章主要介紹了Python量化因子測算與繪圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • PyTorch 張量的基本操作

    PyTorch 張量的基本操作

    PyTorch張量是PyTorch中核心數(shù)據(jù)結(jié)構(gòu),類似于 NumPy 的 ndarray,但具有 GPU 加速能力,下面就來詳細(xì)的介紹一下PyTorch 張量的基本操作,感興趣的可以了解一下
    2025-12-12
  • Python爬蟲:通過關(guān)鍵字爬取百度圖片

    Python爬蟲:通過關(guān)鍵字爬取百度圖片

    本文主要介紹了Python爬蟲:通過關(guān)鍵字爬取百度圖片的方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • TensorFlow的自動求導(dǎo)原理分析

    TensorFlow的自動求導(dǎo)原理分析

    這篇文章主要介紹了TensorFlow的自動求導(dǎo)原理分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python發(fā)送偽造的arp請求

    python發(fā)送偽造的arp請求

    本文介紹了python發(fā)送偽造的arp請求的示例代碼,大家參考使用吧
    2014-01-01
  • Pytorch之parameters的使用

    Pytorch之parameters的使用

    今天小編就為大家分享一篇Pytorch之parameters的使用,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python一步步帶你操作Excel

    Python一步步帶你操作Excel

    這篇文章主要介紹了Python編寫命令行腳本操作excel的方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08

最新評論

田阳县| 新乐市| 黄浦区| 阿克| 宜川县| 临江市| 达拉特旗| 从江县| 开江县| 汶上县| 湄潭县| 苏尼特右旗| 长岭县| 凯里市| 霍林郭勒市| 连江县| 肇源县| 原平市| 屏南县| 侯马市| 内乡县| 贵定县| 房山区| 丰顺县| 杭州市| 聂荣县| 乌苏市| 博罗县| 龙门县| 巴南区| 卢龙县| 潼南县| 汝州市| 镇坪县| 江源县| 沙河市| 武清区| 琼结县| 重庆市| 于田县| 锡林浩特市|