日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python实例化对象做实参_如何在Python中记住类实例化?

發布時間:2023/12/20 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python实例化对象做实参_如何在Python中记住类实例化? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

好的,這是真實的場景:我正在編寫一個應用程序,我有一個類,它表示某種類型的文件(在我的例子中,這是照片,但細節與問題無關)。照片類的每個實例對于照片的文件名都應該是唯一的。

問題是,當用戶告訴我的應用程序加載文件時,我需要能夠識別文件何時已加載,并使用該文件名的現有實例,而不是在同一文件名上創建重復實例。

對我來說,這似乎是一個很好的使用記憶化的環境,有很多這樣的例子,但是在這種情況下,我不僅僅是在記憶一個普通的函數,我需要記憶__init__()。這帶來了一個問題,因為當__init__()被調用時,已經太晚了,因為已經創建了一個新實例。

在我的研究中,我發現了Python的__new__()方法,實際上我可以編寫一個工作簡單的示例,但是當我試圖在我的真實對象上使用它時,它崩潰了,我不知道為什么(我唯一能想到的是,我的真實對象是我無法真正控制的其他對象的子類,因此,這種方法有一些不兼容之處)。這就是我所擁有的:class Flub(object):

instances = {}

def __new__(cls, flubid):

try:

self = Flub.instances[flubid]

except KeyError:

self = Flub.instances[flubid] = super(Flub, cls).__new__(cls)

print 'making a new one!'

self.flubid = flubid

print id(self)

return self

@staticmethod

def destroy_all():

for flub in Flub.instances.values():

print 'killing', flub

a = Flub('foo')

b = Flub('foo')

c = Flub('bar')

print a

print b

print c

print a is b, b is c

Flub.destroy_all()

輸出如下:making a new one!

139958663753808

139958663753808

making a new one!

139958663753872

<__main__.Flub object at 0x7f4aaa6fb050>

<__main__.Flub object at 0x7f4aaa6fb050>

<__main__.Flub object at 0x7f4aaa6fb090>

True False

killing <__main__.Flub object at 0x7f4aaa6fb050>

killing <__main__.Flub object at 0x7f4aaa6fb090>

太完美了!只為給定的兩個唯一id創建了兩個實例,Flub.instances顯然只列出了兩個。

但是當我嘗試對我正在使用的對象使用這種方法時,我得到了各種各樣的荒謬錯誤,關于__init__()如何只使用0個參數,而不是2個參數。所以我會改變一些東西,然后它會告訴我__init__()需要一個參數。完全奇怪。

經過一段時間的斗爭,我基本上放棄了,把所有的__new__()黑魔法移到了一個名為get的staticmethod中,這樣我就可以調用Photograph.get(filename),如果filename不在Photograph.instances中,它只會調用Photograph(filename)。

有人知道我哪里做錯了嗎?有沒有更好的方法來做這個?

另一種思考方式是它類似于單例,只是它不是全局單例,只是每個文件名都是單例。

如果你想一起看的話。

總結

以上是生活随笔為你收集整理的python实例化对象做实参_如何在Python中记住类实例化?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。