终于完美解决了。元类补充、控制对象的生成练习、单例模式,第四十一天

与其说是完美解决了,不如说成痛苦,硬生生扣出几年前的垃圾思想来解决这个问题。引用今天的日志:一个人能对自己有多狠,以后就有多大的可能达到相应的高度。如果把自己当牲口看,能获得非人的成就;如果把自己当人看,顶多是个人,但大多数情况成了牲口。这样做如今算是释怀了,可以稍微放下了,但以后呢?希望未来悔意不要太重,也希望这是对双方伤害最小化的一种做法。但是,也仅仅是希望把,不,应该是奢望把。定要努力到永远不要再一次发生这种事,碰到了对的事、对的人,却不得不用一种极端的方法去处理,去告诉自己你不可以这样...15岁的时候,你说游泳难,放弃了游泳,等你18岁的时候有女生约你说一起游泳,你说不会耶!18岁的时候你说学英语难,放弃了学英语,等到28岁有一份很好的工作需要英语,你只好放弃!最后引用龙应台对他的小孩说的一段话,大概意思——孩子,我让你读书,不是希望你以后能有多大的成就,而是希望你以后能有选择的权力。希望老天你能再佑我一次,先谢啦!!!


1、元类补充

控制对象的产生通用模板

2、控制对象产生练习

class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dic):
        #控制类Foo的创建
        super(Mymeta,self).__init__(class_name,class_bases,class_dic)

    def __call__(self, *args, **kwargs):
        #控制Foo的调用过程,即Foo对象的产生过程
        obj = self.__new__(self)
        self.__init__(obj, *args, **kwargs)
        obj.__dict__={'_%s__%s' %(self.__name__,k):v for k,v in obj.__dict__.items()}

        return obj

class Foo(object,metaclass=Mymeta):  # Foo=Mymeta(...)
    def __init__(self, name, age,sex):
        self.name=name
        self.age=age
        self.sex=sex


obj=Foo('egon',18,'male')
print(obj.__dict__)

3、单例模式

1、什么是单例模式,

单例模式:基于某种方法实例化多次得到的实例是同一个

2、为何用单例模式

当实例化时多个对象中存放的属性都一样的情况,应该让他们指向同一个内存,即同一个实例

3、如何用

# 单例模式实现方式一:
import settings

class Mysql:
    __instacne=None

    def __init__(self,ip,port):
        self.ip=ip
        self.port=port

    @classmethod
    def from_conf(cls):
        if cls.__instacne is None:
            cls.__instacne=cls(settings.IP,settings.PORT)
        return cls.__instacne
# obj=Mysql('1.1.1.10',3306)

obj1=Mysql.from_conf()
obj2=Mysql.from_conf()
obj3=Mysql.from_conf()

print(obj1)
print(obj2)
print(obj3)

obj4=Mysql('10.10.10.11',3307)


# 单例模式实现方式二:
import settings
def singleton(cls):
    cls.__instance=cls(settings.IP,settings.PORT)
    def wrapper(*args,**kwargs):
        if len(args) == 0 and len(kwargs) == 0:
            return cls.__instance
        return cls(*args,**kwargs)
    return wrapper

@singleton #Mysql=singleton(Mysql) #Mysql=wrapper
class Mysql:
    def __init__(self,ip,port):
        self.ip=ip
        self.port=port


obj1=Mysql() #wrapper()
obj2=Mysql() #wrapper()
obj3=Mysql() #wrapper()
print(obj1 is obj2 is obj3)
print(obj1)
print(obj2)
print(obj3)
obj4=Mysql('1.1.1.4',3308)
print(obj4)




# 单例模式实现方式三:
import settings

class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dic): #self=Mysql
        super(Mymeta,self).__init__(class_name,class_bases,class_dic )
        self.__instance=self.__new__(self) #造出一个Mysql的对象
        self.__init__(self.__instance,settings.IP,settings.PORT) #从配置文件中加载配置完成Mysql对象的初始化

        # print(self.__instance)
        # print(self.__instance.__dict__)

    def __call__(self, *args, **kwargs): #self=Mysql
        if len(args) == 0 and len(kwargs) == 0:
            return self.__instance

        obj=self.__new__(self)
        self.__init__(obj,*args,**kwargs)
        return obj



class Mysql(object,metaclass=Mymeta): #Mysql=Mymeta(...)
    def __init__(self,ip,port):
        self.ip=ip
        self.port=port


obj1=Mysql()
obj2=Mysql()
obj3=Mysql()
obj4=Mysql('10.10.10.11',3308)

print(obj1)
print(obj2)
print(obj3)
print(obj4)
今天讲的不多,但都是重点,谢谢观看!!谢谢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值