python对象的内置方法

内置方法:内置方法不需要单独调用,在执行对象的某些操作时会自动调用执行,下面将介绍__new__(单例模式)、__init__、__call__、__del__、__str__、__repr__、__len__、__del__、getitem\setitem\delitem、__eq__
class Student:
    # flag =None
    # def __new__(cls,*args,**kwargs):
    #     if cls.flag is None:
    #         cls.flag = object.__new__(cls)
    #     return cls.flag
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age
    def __call__(self, *args, **kwargs):
        print('欢迎%s调用对象'%self.name)
    def __str__(self):
        return '<in __st__> %s %s %s'%(self.name,self.sex,self.age)
    def __repr__(self):
        return '<in __repr__> %s %s %s' % (self.name, self.sex, self.age)
    def __del__(self):
        print('执行这段代码')
    def __eq__(self, other):
        if self.name == other.name:
            return True
        return False
    def __getitem__(self, item):
        return self.__dict__[item]
    def __setitem__(self, key, value):
        self.__dict__[key] = value
    def __delitem__(self, key):
        self.__dict__.pop(key)

st_a =Student('lv','',30)
st_b =Student('hei','',25)
st_b()
print(st_b,'%s'%st_b,'%r'%st_b)
print(st_a == st_b)
del st_b
print(st_a['name'])
st_a['name'] = 'lv_new'
print(st_a['name'])
del st_a['name']
print(st_a['name'])#执行该句会报错,因为属性已删除

#执行结果:
# 欢迎hei调用对象
# False
# 执行这段代码
# lv
# lv_new
# KeyError: 'name'...
# 执行这段代码
__new__方法是构造方法,用途是创建对象空间,并将对象空间返回给self,需要的参数是cls、*args、**kwargs,在实例化类的对象时会自动执行,示例代码中__new__方法部分实现了单例模式,方法是通过定义一个静态变量,通过这个静态变量来限制object.__new__()的调用;
__init__是初始化函数,用途是初始化对象的一些属性
__call__方法将对象变成一个可调用对象,执行 对象() 时会调用__call__方法;
__str__方法在print(对象)、'%s'%对象、str(对象)时执行,当觉得python默认显示的内容不便用户理解时,可以添加该方法;
__repr__方法是_str__方法的备胎,在'%r'%对象、repr(对象)时会优先执行该方法,print(对象)、'%s'%对象、str(对象)时会优先调用__str__方法,没有__str__方法时则会调用__repr__方法;
__del__方法是在执行 del 对象 前执行,目的是删除变量前给用户提示,实例代码中之所以执行了两次__del__是因为程序在执行完是,python垃圾回收机制会自动执行del st_a来删除st_a;
__len__方法太简单不写,在len(对象)时执行;
__eq__方法,对象 == 对象 时执行,当对象 == 对象 判定时python默认用内存地址进行判别,__eq__方法能够改变判定条件,当对象 == 对象 时,会调用该方法;
__**item__方法:__getitem__、__setitem__、__delitem__分别对应查看、修改、删除属性,调用方式是 对象[属性名]、对象[属性名]=属性值、 del 对象[属性名],这地方需要注意delitem执行时需要手动编写代码,删除要删除的属性,方法并没有自动执行删除功能;
带锁的单例模式
class A:
    from threading import Lock
    lock = Lock()
    __instance = None
    def __new__(cls, *args, **kwargs):
        with cls.lock:
            if cls.__instance == None:
                cls.__instance = object.__new__(cls)
        return cls.__instance
    def __init__(self,name):
        self.name=name

 



posted @ 2018-11-27 20:42  海予心  阅读(119)  评论(0)    收藏  举报