Python中, 仿照经典代码实现单例, 却出现了不是单例的的状态, 代码哪里出错了 ?
巴扎黑
巴扎黑 2017-04-18 10:24:53
0
1
589

实际现象

  • 期望实现单例, 保持某个属性全局唯一

预期现象

  • 仿照经典实现代码, 却出现了不是单例的情况

我要做什么

  • 实现scheduler全局唯一, 不派生过多的scheduler

重现步骤

  1. 拷贝代码

  2. 运行之

  3. 查看内存地址

相关代码

  • 仿照经典实现

from apscheduler.schedulers.background import BackgroundScheduler

class Borg(object):
    

    __shared_state = {}

    def __init__(self):
        self.__dict__ = Borg.__shared_state

        self.scheduler = BackgroundScheduler()
        
        
s1 = Borg().scheduler
s2 = Borg().scheduler

print s1, s2


# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02623DF0> 
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02D801D0>
  • 我自己想的办法

from apscheduler.schedulers.background import BackgroundScheduler


class Borg(object):
    @classmethod
    def get_scheduler(cls):
        try:
            cls_scheduler = cls.scheduler
        except AttributeError as e:
            cls.scheduler = BackgroundScheduler()

            return cls.scheduler
        else:
            return cls_scheduler
        




bs1 = Borg.get_scheduler()
bs2 = Borg.get_scheduler()
bs3 = Borg.get_scheduler()
print bs1, bs2, bs3


# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70> 
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70> 
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70>

上下文环境

  • 产品版本: Python 2.7 APScheduler最新

  • 操作系统: Linux

  • Github链接, 经典实现: https://github.com/faif/pytho...

巴扎黑
巴扎黑

모든 응답(1)
洪涛

이 전형적인 예는 순수한 싱글톤이 아니라 싱글톤 특성을 지닌 Brog 패턴이라고 볼 수 있습니다.

마법은 Brog 클래스가 공유하는 클래스 속성 사전 __shared_state을 사용하는 데 있으며, 나중에 생성된 인스턴스는 이전 인스턴스의 __dict__을 덮어씁니다.

으아악

인스턴스를 생성s1하고 동시에 scheduler 속성을 ​​초기화합니다. 이때 주소는 0x02623DF0이고 다른 인스턴스s2를 생성한 다음 scheduler 속성을 ​​수정하면 다음과 같습니다. 0x02D801D0. s1s2은 실제로는 서로 다른 두 인스턴스이지만 해당 속성은 클래스 속성을 공유하므로 싱글톤처럼 보입니다.

코드를 이렇게 변경하면 프로세스를 더 명확하게 볼 수 있습니다.

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿