天天看點

利用嵌套類(類中有類)實作“執行個體屬性”的層級擷取

需求:建立一個類,然後後類中有類,實作如:parent.childA.name,parent.childB.name這種逐級帶點擷取屬性的要求。

本執行個體主要解決了兩個問題:

1、實作 “執行個體.屬性.屬性”的方式,比如這樣可以很友善的擷取如“school.class.five.student.name”這樣嵌套的屬性。

2、通過将父class的self傳遞個子class,進而讓子class中可以調用父class的self,實作在子類中使用父類中的參數。

class WdTools(object):
    def __init__(self, org_str=None, sqlcmd=None):
        self.__sqlcmd = None
        self.sqlcmd = sqlcmd
        self.__org_str = org_str
        self.org_str = org_str
        
    # 擷取lemma (從單詞原型)
    def get_lemma(self, org_str=None) -> list:
    	# 在這裡寫擷取lemma的代碼
        return 擷取結果

    @property		# 添加lemma屬性
    def lemma(self):
        # lemma的類
        class LemmaCls(object):		# 關鍵步驟,類中再添加一個lemmaCls的類
            def __init__(self, father_self):		# father_self實際是傳遞了上一層執行個體的self
                self.__single = None
                self.__detail = None
                self.__single_plus = None
                self.__detail_plus = None
                self.__father = father_self		# lemmacls的執行個體可以通過self.__father調用上一層的執行個體中的參數

            @property
            def single(self):
                return self.__single if self.__single else self.classify(mode='single')

            @property
            def detail(self):  # 傳回詳細
                return self.__detail if self.__detail else self.classify(mode='detail')

            # 讀取lemma表
            def classify(self, mode='single') -> list:
                    # 這裡就可以根據需要傳回屬性值(可以通過self.__father去調用上一層的參數參與處理)
                    return 處理結果
        return LemmaCls(self)
       
           

通過以上處理,在程式中就可以使用 “執行個體.屬性.屬性” 的模式了。

wt = WdTools()
    wt.org_str = "abandoned"
    print(wt.lemma.single)
    print(wt.lemma.detail)