為什么這兩個陳述句給出不同的結果......
print(Database().id == Database().id)(這給假)- 但它以這種方式給出 True
d1 = Database()
d2 = Database()
print(d1.id == d2.id)
這是整個代碼:
import random
class Database:
initialized = False
def __init__(self):
self.id = random.randint(1, 101)
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Database, cls).__new__(cls, *args, **kwargs)
return cls._instance
print(Database().id == Database().id)
# False
d1 = Database()
d2 = Database()
print(d1.id == d2.id)
# True
uj5u.com熱心網友回復:
__new__()__init__()如果回傳的實體屬于正確的類,則始終呼叫。這意味著,每次Database()呼叫仍在進行中,并將新的隨機值設定為id。
這id是您定義的實體變數,它不會真正影響 的結果id(),這就是為什么如果您這樣做
print(Database() is Database())
True即使id支票回傳false,它也會回傳。實體是相同的,您只是更改id了兩者之間的值,因此它們評估為False。
在第二種情況下,因為背景是一樣的,他們都獲得所產生的價值__init__(),當你分配d2。您可以通過添加print(d1.id)前后d2分配來確認這一點。
您需要使用initialized布林值來正確跳過代碼__init__()
import random
class Database:
initialized = False
def __init__(self):
if not self.initialized:
self.id = random.randint(1, 101)
self.initialized = True
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Database, cls).__new__(cls, *args, **kwargs)
return cls._instance
看看與單蟒蛇通話問題兩次__init__ 如果你想看到一個單獨的類或可替代的其他實作完全接近于避免單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399324.html
