Rumah  >  Soal Jawab  >  teks badan

[Python Newbie] Tanya soalan tentang memulakan objek sekali

Kod adalah seperti berikut:

# -*- coding:gb2312 -*-
class Dog(object):
    __instance = None
    __init_flag = False
    
    def __new__(cls,name):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            return cls.__instance
    def __init__(self,name):
        #self.name = name
        if self.__init_flag == False:
            #__init_flag = True
            self.name = name
            __init_flag = True
a = Dog("旺财")
print(id(a))
print(a.name)

b = Dog("哮天犬")
print(id(b))
print(b.name)

Hasil pelaksanaan:

Soalan saya:


Mengikut idea saya, apa yang saya tulis dalam kod ini adalah untuk mereka bentuk kelas Anjing dan kemudian mencipta objek tunggal (kod dalam kotak merah pertama), iaitu, akhirnya Contoh a dan b sebenarnya adalah perkara yang sama.
Kemudian saya menyediakan objek tunggal ini dan memulakannya sekali sahaja (lihat kod dalam kotak merah kedua, dengan kata lain, selepas contoh a dicipta, namanya Wangcai, kemudian selepas contoh b dicipta, , ia). tidak harus dimulakan, jadi mustahil untuk mencetak nama Roaring Sky Dog. Menurut idea saya, hasil yang sepatutnya dicetak ialah dua kekayaan yang makmur. Mengapa keputusan sekarang berbeza daripada apa yang saya jangkakan?

我想大声告诉你我想大声告诉你2669 hari yang lalu635

membalas semua(1)saya akan balas

  • 阿神

    阿神2017-06-28 09:26:24

    Malah, anda telah pun melaksanakan objek tunggal, dan ia hanya sah dari id的结果已经看出来了, 至于为什么你两次的结果会不一样呢? 因为创建返回是一回事, 初始化又是一回事, 在__new__里面, 确认了不会创建新实例, 返回的是旧实例, 但是这并不影响下一步的__init__初始化动作啊, 而且你修改的__init_flag = True只是在实例对象里面而已, 并没有修改到那边, 所以你的判断在无效的, 只有修改到那边的__init_flag, jadi kod itu disemak semula kepada:

    class Dog(object):
        ....(其他内容请自行补充)...
        def __init__(self, name):
                # self.name = name
                if not self.__init_flag:
                    # __init_flag = True
                    self.name = name
                    Dog.__init_flag = True   # 修改基类的__init_flag 
    

    Dua lagi cadangan:

    1. Apabila menilai sama ada objek itu Tiada, jangan gunakan ==, 应该用is: cls.__instance is None

    2. Nilai sama ada ia sama dengan false, 也不要用==, 应该是not: if not self.__init_flag

    balas
    0
  • Batalbalas