Python解题

这篇文章主要是临时抱佛脚,针对笔试、面试来准备的一些关于python的题目,语言完全是个人理解,方法有可能比较差,勿喷!
  1. Python如何实现单例模式

单例模式是设计模式里面最为基本的一种。

动机是:一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务。

特点是:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

具体实现是:

主要掌握两种:一是__new__ 方法,这种方法就是定义类的时候,将类实例化为变量_instance,那么,每定义一个对象,这个对象就是_instance了,先上代码。

class Singleton(object):
        def __new__(self, *args, **kwargs):
                if not hasattr(self, '_instance'):
                        orig = super(Singleton, self)
                        Singleton._instance = orig.__new__(self, *args, **kwargs)
                return Singleton._instance

class MyClass(Singleton):
        a = 1

one = MyClass() 
two = MyClass() 
two.a = 3
print one.a
print id(one)
print id(two)
print one == two
print one is two
##3
##30580464
##30580464
##True
##True

注解:_instance,变量名_xxx被看作是“私有的”,在模块或类外不可以使用。参考http://blog.csdn.net/frankarmstrong/article/details/8866351

self,是python默认的指向本类的一个变量。参考http://sjolzy.cn/Why-should-self-Python.html

*args、**kwargs,这两个变量要涉及到python里面的星号的作用,一个星号表示位置变量,两个表示关键字变量。参考http://blog.csdn.net/qinyilang/article/details/5484415

hasattr(obj,name) 查看一个obj的name space中是否有name

super(B, self)首先找到B的父类(就是类A),然后把类B的对象self转换为类A的对象self.

另外一种方法是共享属性,共享属性。所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法) ,同一个类的所有实例天然拥有相同的行为(方法), 只需要保证同一个类的所有实例具有相同的状态(属性)即可 ,所有实例共享属性的最简单最直接的方法就是__dict__属性指向(引用)同一个字典(dict)

class Singleton(object):
        _state = {}
        def __new__(self, *args, **kwargs):
                ob = super(Singleton,self).__new__(self, *args, **kwargs)
                ob.__dict__ = self._state
                return ob

class MyClass(Singleton):
        a = 1

one = MyClass() 
two = MyClass() 
two.a = 3
print one.a
print id(one)
print id(two)
print one == two
print one is two
print id(one.__dict__)
print id(two.__dict__)

##3
##31039216
##31039440
##False
##False
##31145536
##31145536



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值