第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 Python 中使用元類(lèi)計(jì)??算實(shí)例數(shù)量

在 Python 中使用元類(lèi)計(jì)??算實(shí)例數(shù)量

紅顏莎娜 2023-08-08 15:58:11
我編寫(xiě)了一個(gè)元類(lèi),它計(jì)算每個(gè)子類(lèi)的實(shí)例數(shù)。所以我的元有一個(gè)類(lèi)似的字典{classname: number_of_instances}。這是實(shí)現(xiàn):class MetaCounter(type):        _counter = {}    def __new__(cls, name, bases, dict):        cls._counter[name] = 0        return super().__new__(cls, name, bases, dict)    def __call__(cls, *args, **kwargs):        cls._counter[cls.__name__] += 1        print(f'Instantiated {cls._counter[cls.__name__]} objects of class {cls}!')        return super().__call__(*args, **kwargs)class Foo(metaclass=MetaCounter):    passclass Bar(metaclass=MetaCounter):    passx = Foo()y = Foo()z = Foo()a = Bar()b = Bar()print(MetaCounter._counter)# {'Foo': 3, 'Bar': 2} --> OK!print(Foo._counter)# {'Foo': 3, 'Bar': 2} --> I'd like it printed just "3"print(Bar._counter) # {'Foo': 3, 'Bar': 2} --> I'd like it printed just "2"它工作得很好,但我想添加一定程度的信息隱藏。也就是說(shuō),元類(lèi)為MetaCounter的類(lèi)不應(yīng)該具有具有相同元的其他類(lèi)的實(shí)例的計(jì)數(shù)器。他們應(yīng)該只知道有關(guān)其實(shí)例數(shù)量的信息。因此應(yīng)該顯示整個(gè)dict,但是(讓Foo是一個(gè)以MetaCounter作為其元類(lèi)的類(lèi))應(yīng)該只返回Foo實(shí)例的數(shù)量。MetaCounter._counterFoo._counter有辦法實(shí)現(xiàn)這一點(diǎn)嗎?我嘗試過(guò)覆蓋__getattribute__,但最終導(dǎo)致計(jì)數(shù)邏輯混亂。我還嘗試將其_counter作為屬性放入方法dict的參數(shù)中__new__,但隨后它也成為實(shí)例成員,而我不希望如此。
查看完整描述

2 回答

?
湖上湖

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊

我不知道足夠的元類(lèi)來(lái)判斷做你正在嘗試的事情是否是一個(gè)壞主意,但這是可能的。


您可以MetaCounter僅保留對(duì)其“元類(lèi)”類(lèi)的引用,并通過(guò)更新dictinMetaCounter.__new__方法為每個(gè)類(lèi)添加特定的實(shí)例計(jì)數(shù)器:


class MetaCounter(type):

    _classes = []


    def __new__(cls, name, bases, dict):

        dict.update(_counter=0)

        metaclassed = super().__new__(cls, name, bases, dict)

        cls._classes.append(metaclassed)

        return metaclassed

每次MetaCounter實(shí)例化一個(gè)新類(lèi)時(shí),都會(huì)增加計(jì)數(shù)器


    def __call__(cls, *args, **kwargs):

        cls._counter += 1

        print(f'Instantiated {cls._counter} objects of class {cls}!')

        return super().__call__(*args, **kwargs)

這確保每個(gè)MetaCounter類(lèi)擁有其實(shí)例計(jì)數(shù)器并且不知道其他MetaCounter類(lèi)的任何信息。


然后,要獲取所有計(jì)數(shù)器,您可以_counters向 中添加一個(gè)靜態(tài)方法MetaCounter,該方法返回每個(gè)類(lèi)的計(jì)數(shù)器MetaCounter:


    @classmethod

    def _counters(cls):

        return {klass: klass._counter for klass in cls._classes}

然后你就完成了:


print(MetaCounter._counters())  # {<class '__main__.Foo'>: 3, <class '__main__.Bar'>: 2}

print(Foo._counter)  # 3

print(Bar._counter)  # 2


查看完整回答
反對(duì) 回復(fù) 2023-08-08
?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊

這是一個(gè)工作示例,使用描述符根據(jù)屬性是由實(shí)例(類(lèi))_counter訪問(wèn)還是由類(lèi)(本例中為元類(lèi))訪問(wèn)來(lái)修改屬性的行為


class descr:


    def __init__(self):

        self.counter = {}

        self.previous_counter_value = {}


    def __get__(self, instance, cls):

        if instance:

            return self.counter[instance]

        else:

            return self.counter


    def __set__(self, instance, value):

        self.counter[instance] = value

    


class MetaCounter(type):

    

    _counter = descr()


    def __new__(cls, name, bases, dict):

        new_class = super().__new__(cls, name, bases, dict)

        cls._counter[new_class] = 0

        return new_class



    def __call__(cls, *args, **kwargs):

        cls._counter += 1

        print(f'Instantiated {cls._counter} objects of class {cls}!')

        return super().__call__(*args, **kwargs)


查看完整回答
反對(duì) 回復(fù) 2023-08-08
  • 2 回答
  • 0 關(guān)注
  • 216 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)